捕获一般异常真的那么糟糕吗?

Tri*_*iss 57 exception

在使用FXCop分析一些遗留代码的同时,我发现在try块中捕获一般异常错误或者您是否正在寻找特定异常真的很糟糕.请给我一张明信片的想法.

Joh*_*ohn 91

显然,这是其中唯一真正的答案是"它取决于"的问题之一.

它依赖的主要是你捕获异常的地方.一般来说,库在捕获异常时应该更加保守,而在程序的顶层(例如在主方法中或在控制器中的操作方法的顶部等),您可以更自由地捕获.

这样做的原因是,例如你不想捕获库中的所有异常,因为你可能会掩盖与你的库无关的问题,比如"OutOfMemoryException",你真的更喜欢冒泡,以便用户可以另一方面,如果你正在谈论捕获异常的main()方法中的异常,显示它然后退出......好吧,这里可以安全地捕获任何异常.

关于捕获所有异常的最重要的规则是,你永远不应该只是静默地吞下所有异常......例如Java中的这样的东西:

try { 
    something(); 
} catch (Exception ex) {}
Run Code Online (Sandbox Code Playgroud)

或者在Python中:

try:
    something()
except:
    pass
Run Code Online (Sandbox Code Playgroud)

因为这些可能是一些最难追查的问题.

一个好的经验法则是,您应该只捕获可以正确处理自己的异常.如果你无法完全处理异常,那么你应该让它冒泡到可以的人身上.

  • 捕获语言边界的所有异常以进行翻译也是一种很好的做法. (7认同)

Jam*_*rue 25

除非你在应用程序的前端进行一些日志记录和清理代码,否则我认为捕获所有异常都是不好的.

我的基本经验法则是捕获您期望的所有异常以及其他任何错误.

如果你抓住所有东西并继续下去,这有点像在你的汽车仪表板上贴上警示灯贴膏药.你不能再看到它,但这并不意味着一切都好.


Che*_*oft 15

是! (除了申请的"顶部")

通过捕获异常并允许代码执行继续,您表明您知道如何处理和规避或修复特定问题.你说这是一个可以恢复的情况.捕获异常或SystemException意味着您将捕获IO错误,网络错误,内存不足错误,缺失代码错误,空指针解除引用等问题.说你可以处理这些是骗人的谎言.

在组织良好的应用程序中,这些不可恢复的问题应该在堆栈中处理得很高.

此外,随着代码的发展,您不希望函数捕获将来添加到被调用方法的新异常.


Eri*_*kel 11

在我看来,你应该捕获你期望的所有异常,但是这个规则适用于除了你的接口逻辑之外的任何东西.在调用堆栈中,你应该创建一种方法来捕获所有异常,做一些日志记录/给用户反馈,如果需要和可能,优雅地关闭.

没有什么比一个应用程序崩溃更糟糕了一些用户不友好的堆栈跟踪转储到屏幕上.它不仅可以提供(可能不需要的)洞察您的代码,而且还会让您的最终用户感到困惑,有时甚至会将它们吓跑到竞争对手的应用程序中.


Tun*_*dey 8

关于这个问题已经进行了很多哲学讨论(更像是论证).就个人而言,我认为你能做的最糟糕的事情就是吞下异常.接下来最糟糕的是允许异常冒泡到表面,用户得到一个令人讨厌的屏幕充满技术mumbo-jumbo.

  • 让异常冒泡并不意味着向最终用户展示它.您可以(并且应该)显示一般错误页面,将其记录下来进行调查,然后首先解决导致异常的问题. (8认同)
  • 不回答问题. (2认同)

Phi*_*ppe 5

好吧,我看不出捕获一般异常或特定异常之间有什么区别,除了当有多个 catch 块时,您可以根据异常的情况做出不同的反应。

总之,您将使用泛型捕获IOException和,但您的程序的反应方式可能不同。NullPointerExceptionException