处理异常,错误和返回值的问题

时间:2011-07-30 02:57:05

标签: c# .net exception-handling error-handling custom-error-handling

我需要你的建议。我的源应用程序变得非常...扩展。我在处理错误,异常等方面遇到了一些问题。

例如,我有“DatabaseProvider”类,其中有与db联系的方法。我必须处理标准异常,无效数据表单数据库(例如错误的电子邮件格式),从数据库返回的错误。我需要返回到调用DatabaseProvider方法的函数的所有东西,以便该方法将记录此异常或错误,并仍然工作。所以我不能抛出异常。

如果这还不够,我必须在大多数情况下返回(从DatabaseProvider)一个值或对象或对象列表。

所以我想,也许创建一个类“响应”。该类的对象将从我的应用程序中的每个方法返回。

是这样的:

public class Response
{
    public bool Error { get; set; }
    public string ErrorMessage { get; set; }        
    public bool DatabaseError { get; set; }
    public string DatabaseMessage { get; set; }

    public Exception ex { get; set; }
}

但是如何在同一时间返回(例如)自设计对象列表?

使用“out”参数是解决方案吗?什么是最好的方法(最佳实践)?我正在搜索这个,但我发现的只是如何处理异常(仅)...

2 个答案:

答案 0 :(得分:4)

我会实现一个自定义异常,包含在异常情况下需要传递的所有数据。像

这样的东西
public class MySpecificException: Exception
{
    public bool Error { get; set; }
    public string ErrorMessage { get; set; }        
    public bool DatabaseError { get; set; }
    public string DatabaseMessage { get; set; }

    public Exception ex { get; set; }
}

抛出异常并在调用函数中使用try catch块来处理特定异常。

public void CallingFunction()
{
    try {
        //call your function
    }
    catch (MySpecificException ex) 
    {
        //log the data from the exception
    }

这正是自定义例外的用途。

这样你仍然可以从函数返回你想要返回的东西(列表或其他)。

答案 1 :(得分:3)

我建议实现一个自定义的Exception,你可以抛出并捕获,而不是返回这些信息,因为它看起来非常错误。

但是,如果您总是希望将某些元信息附加到返回的结果中,您可以实现一个小型车辆类来包含元信息时的结果:

abstract class ResultWrapper
{
    //meta info, such as error references/properties/flags/statistics

    public ResultWrapper([meta info])
    {
        //set meta info
    }
}

class ResultList<T> : ResultWrapper
{
    public readonly List<T> resultList;

    //constructor for resultList, plus meta information for parent
    public ResultList(List<T> resultList, [additional args for meta info]) : base([meta info])
    {
        this.resultList = resultList;
    }
}

class SingleResult<T> : ResultWrapper
{
    public readonly T result;

    //constructor similar to above
}

编辑:根据您的评论,您绝对应该使用可以抛出的自定义异常(可能包装导致例外)。正如Petar所说,这些可以在循环内捕获并在那里处理,而不会停止后续任务的执行。该语言支持异常处理,原因很充分 - 我会使用它。

另外,你的模式中的fyi:

public bool Error { get; set; }
public string ErrorMessage { get; set; }

不需要bool。只需在错误消息/参考字段

上检查非空