什么样的例外无法处理?

时间:2012-10-08 03:35:43

标签: .net exception out-of-memory stack-overflow

  

可能重复:
  List of exceptions that CAN'T be caught in .NET

如文档所述,try / catch块无法处理StackOverflowException和OutOfMemoryException。

是否有其他例外情况也受此限制?

2 个答案:

答案 0 :(得分:2)

杰弗里·里希特(Jeffrey Richter)在他的“通过C#CLR”一书中提到了关于这一主题的几个好点,“生产力交易可靠性”。

顺便说一下,你可以捕捉并处理OutOfMemmory:

  

由于某种原因我无法解释,写作时没有注意细节   .NET Framework的代码。总是可以获得内存不足的情况   然而,我几乎从未看到任何包含catch块的代码从中恢复   OutOfMemoryException异常。事实上,我甚至让一些开发人员告诉我CLR没有   让程序捕获OutOfMemoryException。为了记录,这绝对不是真的;   你可以抓住这个例外。实际上,执行时可能存在许多错误   托管代码,我几乎没有看到开发人员编写试图恢复的代码   这些潜在的失败。

答案 1 :(得分:0)

无法直接捕获的唯一异常是(抛出框架)StackOverflowException。从逻辑上讲,这是有道理的,因为您没有堆栈中的空间来处理此时的异常。来自文档:

  

从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,默认情况下会终止相应的进程。

可以捕获ThreadAbortException,但总是会重新引发,因此具有独特的行为。来自文档:

  

ThreadAbortException是一个可以捕获的特殊异常,但它会在catch块的末尾自动再次引发。

参考:List of exceptions that CAN'T be caught in .NET