仅捕获 "Exception" 是否可接受?

11 浏览
0 Comments

仅捕获 "Exception" 是否可接受?

在使用FXCop分析一些遗留代码时,我突然想到,在try块内捕捉一般异常错误真的那么糟糕吗?还是应该寻找特定的异常?请给我您的想法。

0
0 Comments

在编程中,我们经常会遇到需要捕获异常的情况。然而,问题是我们应该捕获哪些异常呢?这个问题的答案是“取决于情况”。

首先,我们需要考虑的是在哪里捕获异常。一般来说,库应该更加保守地捕获异常,而在程序的顶层(例如在主方法或控制器的顶部的操作方法中)可以更自由地捕获异常。

之所以这样做,是因为在库中捕获所有异常可能会掩盖与库无关的问题,比如"OutOfMemoryException",我们希望这种异常能够上浮,以便通知用户等。但是,如果我们在主方法中捕获异常,然后显示并退出程序,那么在这种情况下捕获几乎任何异常都是安全的。

关于捕获所有异常,最重要的规则是不要悄悄地吞噬所有异常,比如在Java中:

try { 
    something(); 
} catch (Exception ex) {}

或者在Python中:

try:
    something()
except:
    pass

这样做可能会导致最难追踪的问题。

一个很好的经验法则是只捕获你可以完全处理的异常。如果你无法完全处理异常,那么应该让它上浮给能够处理的人。

在语言边界处捕获所有异常并进行转换也是一个好的实践。

"之所以这样做,是因为在库中捕获所有异常可能会掩盖与库无关的问题,比如"OutOfMemoryException" "。有趣的是,.NET框架有时实际上会捕获OutOfMemoryException。

总结起来,捕获异常的方式取决于具体情况。在库中要保守地捕获异常,以免掩盖其他问题。在程序的顶层可以更自由地捕获异常。无论在哪里捕获异常,我们都应该遵循一些原则,比如不要悄悄地吞噬所有异常,只捕获自己能够完全处理的异常。同时,在语言边界处捕获异常并进行转换也是一个好的实践。

0
0 Comments

在应用程序的“顶部”除外,是的!通过捕获异常并允许代码继续执行,您说明您知道如何处理和规避或修复特定问题。您声明这是一个可恢复的情况。捕获Exception或SystemException意味着您将捕获诸如IO错误、网络错误、内存不足错误、丢失代码错误、空指针解引用等问题。说你能处理这些是一个谎言。

在一个良好组织的应用程序中,这些无法恢复的问题应该在堆栈的高层处理。

此外,随着代码的演进,您不希望您的函数捕获将来添加的新异常。

捕获可以用于添加附加信息,然后重新抛出,对吗?

0
0 Comments

在应用程序的前端进行一些日志记录和清理代码之外,我认为捕获所有异常是不好的。
我的基本原则是捕获所有你期望的异常,其他任何异常都是一个bug。
如果你捕获所有异常并继续执行,就像在你的汽车仪表盘上贴一张创口贴一样。你看不见它了,但这并不意味着一切都没问题。
在编写代码时,我们经常需要处理异常情况。有时我们只希望捕获特定类型的异常,并进行相应的处理。然而,有时我们可能会尝试捕获所有异常,使用"Exception"来捕获所有可能的异常类型。这样做的原因是什么?以及是否可以只捕获"Exception"类型的异常?
首先,我们来看一下出现这个问题的原因。有人认为,捕获所有异常可能会掩盖真正的问题。就像在汽车仪表盘上贴一张创口贴一样,虽然警示灯不再亮起,但这并不意味着车辆没有问题。同样,捕获所有异常,尤其是没有预料到的异常,可能会掩盖潜在的错误,使问题难以发现和解决。
那么,应该如何解决这个问题呢?一种解决方法是只捕获我们预期的异常,而其他异常则被视为bug。这样做可以帮助我们更好地跟踪和调试代码,找出潜在的问题并及时修复。另一种解决方法是使用多个catch块,每个catch块分别处理不同类型的异常。这样可以根据具体的异常类型进行相应的处理,提高代码的稳定性和可靠性。
捕获所有异常可能会掩盖真正的问题,因此不建议只捕获"Exception"类型的异常。相反,我们应该根据具体情况选择捕获特定类型的异常,并采取相应的处理措施。这样可以帮助我们更好地调试和维护代码,提高代码的质量和可靠性。
以下是示例代码,演示了捕获特定类型的异常以及使用多个catch块处理不同类型异常的方法:

try {
// Some code that may throw exceptions
} catch (FileNotFoundException e) {
// Handle FileNotFoundException
} catch (IOException e) {
// Handle IOException
} catch (Exception e) {
// Handle other exceptions
}

[/apcode]

0