gpt4 book ai didi

.net - 如何绕过 .NET 中未处理的异常处理来克服 StackOverflowException

转载 作者:行者123 更新时间:2023-12-02 15:01:50 25 4
gpt4 key购买 nike

在 .NET 中遇到一些 StackOverflowExceptions 后,我注意到它们完全绕过了 .NET 提供的未处理的异常处理程序(Application.ThreadException/AppDomain.UnhandledException)。这是非常令人不安的,因为我们在这些异常处理程序中有关键的清理代码。

有什么办法可以克服这个问题吗?

最佳答案

所谓的“异步异常”分为三种。它们是 ThreadAbortException、OutOfMemoryException 和提到的 StackOverflowException。代码中的任何指令都允许出现这些异常。

而且,还有一种方法可以克服它们:

最简单的是 ThreadAbortException。当当前代码在finally block 中执行时。 ThreadAbortExceptions 有点“移动”到finally block 的末尾。因此,finally block 中的所有内容都不能被 ThreadAbortException 中止。

要避免 OutOfMemoryException,只有一种可能性:不要在堆上分配任何内容。这意味着您不允许创建任何新的引用类型。

要克服 StackOverflowException,您需要框架的一些帮助。这种帮助体现在约束执行区域中。所需的堆栈在实际代码执行之前分配,此外还确保代码已经过 JIT 编译,因此可供执行。

在约束执行区域中执行代码有三种形式(复制自 BCL Team Blog ):

  • ExecuteCodeWithGuaranteedCleanup,try/finally 的堆栈溢出安全形式。
  • try/finally block 后面紧跟着对 RuntimeHelpers.PrepareConstrainedRegions 的调用。 try block 不受约束,但该 try 的所有 catch、finally 和错误 block 都是受约束的。
  • 作为关键终结器 - CriticalFinalizerObject 的任何子类都有一个在分配对象实例之前急切准备的终结器。
    • 一个特例是 SafeHandle 的 ReleaseHandle 方法,这是一个在分配子类之前预先准备好的虚拟方法,并从 SafeHandle 的关键终结器中调用。

您可以在这些博客文章中找到更多信息:

Constrained Execution Regions and other errata [Brian Grunkemeyer]在 BCL 团队博客。

Joe Duffy 的博客关于 Atomicity and asynchronous exception failures他对 .net 框架中的异步异常和稳健性进行了很好的概述。

关于.net - 如何绕过 .NET 中未处理的异常处理来克服 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/107735/

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