繁体   English   中英

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

[英]What's the correct way to deal with Try/Catch Blocks and Errors in General when using multiple classes?

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

例如:

你有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:错误的可能性可能是无穷无尽的,特别是如果你有大中型程序。 你们如何处理用户运行程序时可能遇到的不可知错误?

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

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

但是如果您需要摆脱该功能,或者您正在运行一系列需要在主类中取得成功的函数,那么在类1中进行处理可能会更好。

警告:每条规则都有例外(哈!)。 随着您的编程越来越多,您可以直观地了解应该在哪里进行错误处理 - 但通常会有多个选项,而且可能并不明确。

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

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

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

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

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

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

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

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

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

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

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

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

这取决于您如何可视化和构建应用程序。 1类和2类是同一模块的一部分还是属于不同的模块? 通常,模块提供“API”,“API”的调用者需要捕获错误和异常。 看看防守编程

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

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

如果类1和2在同一个模块中,那么它又取决于您是否要在内部类中处理异常。

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM