使用多个类时,一般处理Try / Catch块和错误的正确方法是什么?

时间:2012-08-15 13:38:27

标签: c# error-handling try-catch structure

我试图在这里理解程序的正确结构以促进一切。基本上在哪里“放”东西。

例如:

你有2个班级。

第1类是你的主力。

这两个课程都有很多方法。

Class 1调用Class 2的实例并运行一个方法。该方法应该返回一个值。

问题1: 我是否应该在此方法中使用try / catch块(在第2类中)?

问题2: try / catch块应该是我调用方法的地方(在Class 1中)吗?

try
   method();
catch
...

问题3: 当执行类2中的方法时,在返回值时,我是否应该返回“错误代码”然后在调用类中处理此代码?

问题4: 当一个错误发生并且我需要“停止”程序时,我应该使用if / else语句,这样代码只有在满足正确条件时才向前移动,或者我应该经常使用关键字“break”吗?

问题5: 错误的可能性可能是无穷无尽的,特别是如果你有大中型程序。你们如何处理用户运行程序时可能遇到的不可知错误?

5 个答案:

答案 0 :(得分:4)

例外就是:例外。您不应该使用常规程序流的例外。 (如果你说,“哦,是的,我希望如此”,它可能不应该是一个例外。)

处理需要处理的异常。如果你能在没有try-catch块成功的情况下继续工作,那么你应该在那里处理它。同样,如果你需要包装一些东西,你也可以在C#中添加一个finally块(usingfinally类似 - 它会编译为try-finally,但是不像自己编写它那样健壮。它只是在你指定的一次性对象上调用.Dispose()

但是如果您需要摆脱该功能,或者您正在运行一系列需要在主课程中取得成功的功能,那么最好在您的1级中进行处理。

警告:每条规则都有例外(哈!)。当您编程更多时,您可以直观地了解应该在何处进行错误处理 - 但通常会有多个选项,并且可能不是很明确。

答案 1 :(得分:3)

一般来说,所有这些问题的答案都是“它取决于”。显然,您需要做的事情取决于具体情况及其包含的应用程序。

从实践的角度来看,我通常遵循一些规则:
1.使用异常处理而不是错误代码
2.当我知道如何处理异常时,只使用try / catch

显然没有人可以告诉你是否需要在方法中使用try / catch而不知道该方法的作用以及是否可以处理任何异常。

错误代码是否真的适用取决于您。我一般认为它不适用;但是,有时它可能会。在这些情况下,如果调用者总是使用代码而不传递代码,我只会将其视为适用。 “GetErrorCode”可能是错误代码可能适用的一个很好的例子。

您无法“处理”(即补偿)“未知”错误。建议的做法是不处理异常并让句柄正常终止,因为它处于未知状态。

答案 2 :(得分:0)

我总体上同意大卫和彼得...我要补充的一件事就是要小心你抓到它们时遇到的异常...... Richter有一个关于异常处理和如何继承被支持的异常与实际实现的方式......但即便如此,如果你发现自己一直在捕捉通用的异常类,那么(IMO)是懒惰的,或者至少是经过深思熟虑......

如果你正在进行文件读/写,你很可能想要捕获适当的IO异常,但是为了始终捕获最通用的异常类会导致你出现问题,如果抛出NullReferenceException并且你的try / catch只是保护免受IO异常...你的catch块会尝试修复(它假设的)一个IO异常,它可能会使你的代码处于一个非常不稳定的状态。

另外,要非常小心继续重新抛出原始错误,除非你确信你正确处理它...如果你写了一个库并发布它并吞下所有错误因为你认为你在做最好的事情,然后消耗你的库的人将无法调试正在发生的事情...异常也会被抛入服务器日志中,因此吞下的错误永远不会在那里。

我主张捕获一般错误的一个地方是在UI层,你显然不希望向用户显示YSOD,但即便如此,你的捕获应该可能会做一些日志记录或某些东西来帮助你调试后面。

答案 3 :(得分:0)

捕获异常并返回错误代码/ bool导致“箭头”代码如下:

if(Func1())
{
   if (Func2())
   {
       if (Func3())
       {
       }
   }
}

我遗憾地维护了一个复杂的项目,其中异常被视为埃博拉病毒,并且在它们萌芽时就被包含在内。它实际上只是让代码更难理解和维护。

答案 4 :(得分:0)

这取决于您如何可视化和构建应用程序。是1级和1级2个相同模块的部分还是它们在不同的模块中?通常,模块提供“API”,“API”的调用者需要捕获错误和异常。看看Defensive Programming

  

问题1:我是否应该在此方法中使用try / catch块(在第2类中)?

如果Class 2是一个单独的模块,并且您不希望将异常传播给调用者模块,那么是。如果你愿意,那么没有。然后需要记录从此类/模块抛出的异常。

如果是1级和1级2在同一个模块中,然后再取决于你是否想要处理内部类中的异常。

  

问题2:try / catch块应该是我调用方法的地方(在Class 1中)吗?

如果您想保护以确保第1类不会引发进一步的例外,那么是。

  

问题3:当执行第2类中的方法时,在返回值时,我是否应该返回“错误代码”然后在调用类中处理此代码?

如果要抛出异常返回错误代码,则再次是设计/实现决策。

  

问题4:当一个错误发生并且我需要“暂停”程序时,我应该使用if / else语句,这样代码只有在满足正确条件时才会向前移动,或者我应该更频繁地使用关键字“break” ?

要使用break,您需要在调用者中使用循环。

  

问题5:错误的可能性可能是无穷无尽的,特别是如果您有大中型程序。你们如何处理用户运行程序时可能遇到的不可知错误?

大型程序分为模块,可由不同的开发人员编写。所以设计和界面合同在这里变得至关重要。