C#:应该捕获所有exception

是否应该在C#程序中捕获所有exception,或者是一些例外(例如堆栈溢出,内存不足等),您应该允许程序崩溃,因为无法从它们中恢复?

您应该只捕获您能够处理的exception。 永远不会捕获exception并且什么也不做。 尽力避免首先发生exception。 这在.Net中尤为重要,因为exception会因堆栈跟踪而导致性能下降。

当然,这取决于程序,但总的来说,只捕获您可以以有意义的方式实际执行某些操作的exception。

请参阅有关捕获OutOfMemoryException (通常可以从中恢复)的问题,以及关于捕获StackOverflowException (通常不可能)的问题。

如果您正在编写一个长期运行的应用程序(例如Web服务器),那么您当然希望捕获所有可能的exception以防止它们终止整个过程。 如果您正在编写一个影响较小的最终用户应用程序,那么可能只是记录exception并快速失败是最佳解决方案。

不可能(完全)为意外做好准备。

是的,至少应该记录exception,给出关于崩溃时系统/程序状态的尽可能多的信息。 日志记录应用程序块是记录错误的更强大的自动方法之一。

关于该主题的MSDN文章:

http://msdn.microsoft.com/en-us/library/ms229005.aspx

强调:

通过在应用程序代码中捕获非特定exception(例如System.Exception,System.SystemException等)来避免处理错误。 有些情况下,处理应用程序中的错误是可以接受的,但这种情况很少见。

应用程序不应处理可能导致意外或可利用状态的exception。 如果您无法预测exception的所有可能原因并确保恶意代码无法利用生成的应用程序状态,则应允许应用程序终止而不是处理exception。 …

您应该只捕获可以从中恢复的exception。 …

在捕获和重新抛出exception时,更喜欢使用空掷( throw; )。 这是保留exception调用堆栈的最佳方法。

MSDN杂志关于.NET 4.0中的exception处理更改 – “使用Catch仍然错误(例外e)” – http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070057

从商业应用程序开发POV,应该捕获所有exception,并且应该允许NONE使程序崩溃。 因为,现在,计算机用户可以区分错误消息和应用程序崩溃对话框。

崩溃的产品给客户留下了不好的印象。 当您无法恢复时,您可以礼貌地显示一条错误消息,说该应用程序将立即退出,并且用户必须再次启动该应用程序。 然后,当用户在modal dialog上按下确定时,正常退出。

有时候,当无法恢复时,您可以提供有用的信息。 例如,在内存不足的情况下,您可以建议用户在再次启动此应用程序之前关闭其他应用程序(如果有)。

虽然,最终结果是相同的,但友好的错误消息比OS生成的崩溃对话框给出了更好的印象。

如果您认为用户以非预期的方式与您的应用程序交互可能会出现问题,那么您必须始终捕获可能的exception,并使用相关的错误消息处理它。