程序从不尝试从哪个例外中恢复?

pok*_*oke 29 .net c# vb.net

例外可能会对程序产生不同程度的影响.例如,如果OutOfMemoryException引发程序,程序应该可以中止,但是可以在System.Data.SqlClient.SqlException不将程序置于未知状态的情况下安全且适当地处理.

我明白,如果没有正确处理,任何异常都有可能使程序处于不稳定状态.是否存在除了简单地记录和抛弃堆栈之外永远不应该处理的异常?

TLS*_*TLS 36

这是一个逐案理论问题,所以答案也是理论上的.我听过的最好的答案是," 如果你不知道如何处理它,不要处理异常. "记录消息并将异常抛到堆栈上是很好的,因为你实际上已经做了一些事情(甚至如果它只是表明发生了错误).但是,捕获错误而不是将其抛出堆栈可能会导致隐藏的错误和困难的调试会话.

我们一直在做的是实现一个顶级的错误处理程序,它将执行一般的错误处理(比如记录消息,警告开发人员等).所有在代码中未处理的异常至少由顶级处理程序处理.代码中可以处理的异常当然会在它们发生的地方处理.

考虑循环电子邮件地址列表以将邮件发送到邮件列表的情况.如果其中一个电子邮件地址格式不正确,但我们不希望单个电子邮件地址导致其余处理失败,则可能会发生异常.通过处理发生的特定异常类型,我们可以记录它(甚至将电子邮件地址标记为无效)并继续处理列表的其余部分.

结论:您是否处理给定的异常类型实际上取决于您的代码是否知道在发生异常类型时要执行的恢复操作.

  • 我听说过关于不处理你不知道该怎么做的异常的引用.这就是*关于异常处理的最佳建议.如果你不介意语言障碍,那本书*Exceptional C++*解释了我们可以为图书馆用户提供我们设计的课程以及如何恢复程序状态的保证(基本,强大,现在抛出). (4认同)

Aak*_*shM 18

框架设计指南涵盖这个漂亮的彻底:

除非您打算重新抛出,否则不要在框架代码中捕获System.Exception或System.SystemException.

...

不要捕获System.StackOverflowException.

以编程方式处理堆栈溢出非常困难.您应该允许此异常终止进程并使用调试来确定问题的根源.

...

不要显式捕获System.Runtime.InteropServices.SEHException.