【问题标题】:What kind of Exceptions cannot be handled? [duplicate]哪些异常不能处理? [复制]
【发布时间】:2012-10-08 03:35:43
【问题描述】:

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

据记载,try/catch 块无法处理 StackOverflowException 和 OutOfMemoryException。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 我会说一个有点不同的问题:没有被抓到,但处理......你可以抓住 OutOfMemory,但处理一般来说不是一个聪明的举动......
      猜你喜欢
      • 2018-03-25
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2011-07-02
      • 1970-01-01
      • 2012-01-12
      相关资源
      最近更新 更多