gpt4 book ai didi

c# - 应用程序代码中 try-catch block 无法捕获的异常

转载 作者:IT王子 更新时间:2023-10-29 04:54:25 24 4
gpt4 key购买 nike

MSDN 声明 StackOverflowException can't be caught by try-catch block从 .NET Framework 2 开始。

Starting with the .NET Framework version 2.0, a StackOverflowException object cannot be caught by a try-catch block and the corresponding process is terminated by default.

是否有任何其他具有相同行为的异常?

最佳答案

是的,还有一些:

  • ThreadAbortedException 很特殊。除非 catch block 调用 ResetAbort(),否则它总是会在被捕获时重新引发。当 CLR 粗鲁地中止线程时,它是完全无法捕获的。例如,当 AppDomain 被卸载时完成,通常是在程序退出时。

  • 由 native 代码启动的线程中非托管代码抛出的任何 native 异常都是不可捕获的。这里的常见场景是 COM 组件启动自己的线程。 CLR 无力捕获此类异常,它不知道线程,也无法注入(inject) catch block 。如果 native 代码没有捕获到异常,则 Windows 会终止该进程。

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

  • 从 .NET 4.0 开始,无法捕获 ExecutionEngineException。当 CLR 检测到其内部数据结构被破坏时,它会被抛出。最典型的是在垃圾收集器忙碌时引发的 AccessViolationException。在 GC 堆受到威胁时继续执行托管代码是一个冒险的提议,并且可以利用,.NET 4 完全取消了它。

  • 从 .NET 4.0 版的 CLR 开始,但也可能出现在与早期版本互操作的非托管代码中,Microsoft 的安全 CRT 可以在检测到安全问题时立即终止程序。这实际上不是引擎盖下的异常,该进程会立即终止,因为代码认为该进程已受到威胁并且无法安全地处理异常。一个常见的情况是 native 函数的堆栈框架被破坏,这是 native 代码中的一个常见问题,并且被病毒代码用来修改返回地址以运行任意代码。一种称为“堆栈缓冲区溢出”的攻击场景。在 .NET 4.0 发布后的早期,CLR 代码中有一些错误警报,但我已经有一段时间没有看到任何错误警报了。您可以通过超出 stackalloc 范围的写入来自行触发此类中止。

  • 非常臭名昭著的是,当您在 64 位操作系统的 WOW64 仿真层中以 32 位模式运行代码并且附加了调试器时,Windows 消息处理程序会抛出异常。最著名的是 Winforms 中麻烦的 Load 事件,但也存在于其他消息和其他运行时环境中。丑陋的细节在this answer .

  • 从 .NET 4.5 开始,Microsoft 将异常归类为损坏状态异常 (CSE)。它们可以被捕获,但这只能由顶级异常处理程序来完成,该处理程序除了为用户生成诊断信息并无条件终止应用程序外什么都不做。背景程序在 this magazine article 中可用.

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

关于c# - 应用程序代码中 try-catch block 无法捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com