1

可能重复:
在 .NET 中无法捕获的异常列表

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

是否还有其他例外情况也受到此限制的影响?

4

2 回答 2

2

Jeffrey Richter 在他的《通过 C# 实现的 CLR》一书中就这个主题提出了几个很好的观点,部分“以可靠性换取生产力”。

顺便说一句,您可以捕获并处理 OutOfMemory:

出于某种我无法完全解释的原因,在为 .NET Framework 编写代码时,并没有对细节进行这种关注。总是可能出现内存不足的情况,但我几乎从未见过任何包含从 OutOfMemoryException 中恢复的 catch 块的代码。事实上,我什至有一些开发人员告诉我,CLR 不允许程序捕获 OutOfMemoryException。郑重声明,这绝对不是真的;你可以捕捉到这个异常。事实上,在执行托管代码时可能会出现许多错误,而且我几乎从未见过开发人员编写代码来尝试从这些潜在故障中恢复。

于 2012-10-08T03:47:06.193 回答
1

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

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

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

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

参考:不能在 .NET 中捕获的异常列表

于 2012-10-08T03:39:14.337 回答