C# 可以';应用程序代码中的try-catch块无法捕获

C# 可以';应用程序代码中的try-catch块无法捕获,c#,exception,C#,Exception,MSDN声明StackOverflowException从.NET Framework 2开始 从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,默认情况下会终止相应的进程 是否有其他具有相同行为的例外情况?是的,还有其他一些例外情况: ThreadAbortedException是特殊的。捕获时它将始终重新引发,除非catch块调用ResetAbort()。当CLR执行线程的粗略中止时,它是完全不可调度的。例如,在卸载

MSDN声明
StackOverflowException
从.NET Framework 2开始

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


是否有其他具有相同行为的例外情况?

是的,还有其他一些例外情况:

  • ThreadAbortedException是特殊的。捕获时它将始终重新引发,除非catch块调用ResetAbort()。当CLR执行线程的粗略中止时,它是完全不可调度的。例如,在卸载AppDomain时完成,通常在程序退出时完成

  • 由本机代码启动的线程中的非托管代码引发的任何本机异常都是不可修补的。这里的常见场景是启动自己线程的COM组件。CLR无法捕获此类异常,它不知道线程,也无法注入catch块。如果本机代码未捕获异常,则Windows将终止该进程

  • 终结器引发的任何异常,除非它们是关键终结器。他们将中止终止进程的终结器线程

  • 从.NET 4.0开始,ExecutionEngineeException是不可修补的。当CLR检测到其内部数据结构被破坏时,它将被抛出。最典型的情况是在垃圾回收器忙时引发AccessViolationException。当GC堆被破坏时,继续执行托管代码是一个危险的提议,可利用的.NET 4完全阻止了它

  • 从.NET 4.0版本的CLR开始,但也可能存在于与早期版本互操作的非托管代码中,Microsoft的安全CRT可以在检测到安全问题时立即终止程序。这实际上并不是一个隐藏的异常,进程会立即终止,因为代码认为进程已被破坏,无法安全地处理异常。一个常见的情况是本机函数的堆栈框架被破坏,这是本机代码中的一个常见问题,病毒代码使用它来修补返回地址以运行任意代码。一种称为“堆栈缓冲区溢出”的攻击场景。在.NET4.0发布后的早期,CLR代码中有一些错误警报,但我已经有很长一段时间没有看到了。您可以通过在stackalloc的边界之外写入来触发这样的中止

  • 非常臭名昭著的是,当您在64位操作系统上的WOW64仿真层中以32位模式运行代码并附加了调试器时,Windows消息处理程序会引发异常。Winforms中最著名的错误加载事件,也适用于其他消息和其他运行时环境。丑恶的细节正在被揭露

  • 从.NET 4.5开始,Microsoft将异常分类为损坏状态异常(CSE)。它们可以被捕获,但这只能由顶级异常处理程序完成,该处理程序除了为用户的利益生成诊断之外,什么都不做,并且无条件终止应用程序。有关背景资料,请参阅

  • 无法捕获或报告在代码开始运行之前由抖动引发的任何异常。编译Main()方法失败是常见的情况,通常是FileNotFoundException


@Oded见备注部分“版本注意事项”方框。引文:“从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,相应的进程默认终止。”@Blachshma亲爱的编辑们,你能告诉我这些大写字母的意思吗。@BorisTreukhov什么大写字母?为什么这个问题结束了。NET程序员不应该被允许知道为什么他们的应用程序在没有诊断的情况下崩溃到桌面上?