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

本文关键字:返回值 问题 错误 异常 处理 | 更新日期: 2023-09-27 18:04:05

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

例如,我有"DatabaseProvider"类,其中有与db联系的方法。我必须处理标准异常,无效的数据形式数据库(例如错误的电子邮件格式),从数据库返回的错误。所有这些东西都需要返回给调用DatabaseProvider方法的函数,那个方法会记录这个异常或错误,并且还能工作。所以我不能抛出异常。

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

所以我想,也许可以创建一个类"Response"。这个类的对象会从我的应用程序中的每个方法中返回。

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

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

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

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
    }

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

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

我建议实现一个可以抛出和捕获的自定义Exception,而不是返回此信息,因为它似乎非常特定于错误。

然而,如果你总是想在返回的结果中附加特定的元信息,你可以实现一个小的vehicle类来包装结果,同时携带元信息:

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
}

Edit:根据你的评论,你绝对应该使用你可以抛出的自定义异常(可能的包装导致异常)。正如Petar所说,这些可以在循环中捕获并在那里处理,而不会停止后续任务的执行。语言支持异常处理是有充分理由的——我会利用它。

还有,在你的模式中:

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

不需要bool。检查错误信息/引用字段

是否为非空