【发布时间】:2012-10-08 03:35:43
【问题描述】:
据记载,try/catch 块无法处理 StackOverflowException 和 OutOfMemoryException。
是否还有其他例外情况也受到此限制的影响?
【问题讨论】:
标签: .net exception out-of-memory stack-overflow
据记载,try/catch 块无法处理 StackOverflowException 和 OutOfMemoryException。
是否还有其他例外情况也受到此限制的影响?
【问题讨论】:
标签: .net exception out-of-memory stack-overflow
Jeffrey Richter 在他的《通过 C# 实现的 CLR》一书中提出了几个很好的观点,“以可靠性换取生产力”部分。
顺便说一句,您可以捕获并处理 OutOfMemory:
由于某些我无法完全解释的原因,写作时没有注意细节 .NET 框架的代码。总是有可能出现内存不足的情况 但我几乎从未见过任何包含从一个 catch 块中恢复的代码 内存不足异常。事实上,我什至有一些开发人员告诉我 CLR 没有 让程序捕获 OutOfMemoryException。郑重声明,这绝对不是真的; 你可以捕捉到这个异常。事实上,执行时可能会出现很多错误 托管代码,我几乎从未见过开发人员编写试图从中恢复的代码 这些潜在的失败。
【讨论】:
唯一不能直接捕获的异常是(框架抛出的)StackOverflowException。从逻辑上讲,这是有道理的,因为此时堆栈中没有空间来处理异常。来自文档:
从 .NET Framework 2.0 版开始,StackOverflowException 对象无法被 try-catch 块捕获,相应的进程默认终止。
ThreadAbortException 可以被捕获,但总是会被重新引发,因此具有独特的行为。来自文档:
ThreadAbortException 是一个可以被捕获的特殊异常,但它会在 catch 块结束时自动再次引发。
【讨论】: