C#:应该捕获所有异常

时间:2011-03-22 02:16:15

标签: c# exception

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

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

当然,这取决于程序,但一般情况下,只捕获您可以以有意义的方式实际执行某些操作的异常。

请参阅此question about catching an OutOfMemoryException(您通常可以从中恢复)和catching a StackOverflowException这个(通常不可能)。

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

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

答案 2 :(得分:1)

是的,至少应记录异常,在崩溃时提供有关系统/程序状态的尽可能多的信息。 Logging Application Block是记录错误的更强大的自动方法之一。

答案 3 :(得分:1)

关于该主题的MSDN文章:

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

亮点:

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

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

您应该只捕获可以从中恢复的异常。 ...

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

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

当您认为用户以非预期的方式与您的应用互动时可能会出现问题时,您必须始终捕获可能的异常,并使用相关的错误消息处理它。