1

我需要你的建议。我的源应用程序变得非常……扩展。我在处理错误、异常等方面有一点问题。

例如,我有“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”参数是解决方案吗?什么是最好的方法(最佳实践)?我正在搜索,但我发现的只是如何处理异常(仅)..

4

2 回答 2

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
    }

这正是自定义异常的用途。

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

于 2011-07-30T03:09:59.213 回答
3

我会建议实现一个自定义的异常,你可以抛出和捕捉,而不是返回这个信息,因为它看起来非常特定于错误。

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

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 所说,这些可以在循环中捕获并在那里处理,而不会停止后续任务的执行。该语言支持异常处理是有充分理由的——我会使用它。

另外,在您的模式中仅供参考:

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

没有必要bool。只需检查错误消息/参考字段上的非空值

于 2011-07-30T03:04:26.100 回答