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

2024-03-28

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

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


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

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

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

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

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

在约束执行区域中有三种形式执行代码(复制自BCL 团队博客 http://blogs.msdn.com/bclteam/archive/2005/06/14/429181.aspx):

  • ExecuteCodeWithGuaranteedCleanup,try/finally 的堆栈溢出安全形式。
  • try/finally 块前面紧跟着对 RuntimeHelpers.PrepareConstrainedRegions 的调用。 try 块不受约束,但该 try 的所有 catch、finally 和错误块都是受约束的。
  • As a critical finalizer - any subclass of CriticalFinalizerObject has a finalizer that is eagerly prepared before an instance of the object is allocated.
    • 一个特殊情况是 SafeHandle 的 ReleaseHandle 方法,这是一个在分配子类之前急切准备的虚拟方法,并从 SafeHandle 的关键终结器中调用。

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

约束执行区域和其他勘误表 [Brian Grunmeeyer] http://blogs.msdn.com/bclteam/archive/2005/06/14/429181.aspx在 BCL 团队博客上。

乔·达菲 (Joe Duffy) 的博客关于原子性和异步异常失败 http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=c1898a31-a0aa-40af-871c-7847d98f1641他对 .net Framework 中的异步异常和稳健性进行了很好的概述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何绕过 .NET 中未处理的异常处理来克服 StackOverflowException 的相关文章

  • 什么是适合 .net 的优秀 RDF 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以处理 RDF 和 OWL 数据的库 到目前为止我已经发现 semweb http razor occams info c
  • 合并多个列表

    鉴于我有一个列表列表 List
  • IEnumerable.GetEnumerator() 和 IEnumerable.GetEnumerator()

    在 net框架中 有一个通用的IEnumerable
  • 处理量角器中的未知错误

    我有一个protractor通过配置多个浏览器进行设置multiCapabilities 在 browserstack 上运行测试 我的主要量角器规格 测试之一包含以下内容afterEach block afterEach function
  • 非法监控状态异常

    如何将轮询线程传递给另一个线程进行处理 程序执行在控制器类中 该类具有 main 方法和线程池 主类控制器 public static void main String args throws InterruptedException Ru
  • WCF 每个端点有不同的身份验证方法

    我有 WCF 服务 我的服务有 2 个端点 每个端点都有不同的联系人 该服务使用自定义用户名身份验证 在 的 customUserNamePasswordValidatorType 属性中定义 问题是两个端点将使用相同的身份验证方法 无论如
  • 最佳实践:从属性中抛出异常

    什么时候适合从属性 getter 或 setter 中抛出异常 什么时候不合适呢 为什么 关于这个主题的外部文档的链接会很有帮助 谷歌搜索结果出奇的少 Microsoft 在以下位置提供了有关如何设计属性的建议 http msdn micr
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • 将绝对路径转换为相对路径 C# [重复]

    这个问题在这里已经有答案了 可能的重复 获取相对于当前工作目录的路径 https stackoverflow com questions 703281 getting path relative to the current working
  • 在 Orchard 中设置唯一的主体类和 ID

    有没有办法在 Orchard 中为每页设置唯一的正文类和 ID 我希望能够在 编辑页面 部分控制这些 例如 主页的正文 ID 为 home 关于页面的正文 ID 为 about 等 并且 如果 about 页面下有子页面 这些页面将具有 a
  • 在 PCL 中使用 System.Net.Sockets(.Net 4.5 + 电话 8)

    我现有的 Net 库已经适用于 Net 4 5 和 Windows Phone 8 现在我想将其转换为可移植类库 突然我无法使用System Net Sockets不再了 我只检查了 Net 4 5和Windows Phone 8 未选择X
  • 如何在.NET中扩展环境变量%CommonProgramFiles%\system\

    我遇到一种情况 我需要通过读取注册表设置来返回目录路径 注册表值返回我以下格式的路径 CommonProgramFiles System web32 dll 而消费者代码期望它的格式为 C Program Files Common File
  • Python Tornado 中的异常处理

    我正在尝试处理发生的异常AsyncClient fetch这样 from tornado httpclient import AsyncHTTPClient from tornado httpclient import HTTPReques
  • 使用 .NET 在 Windows 中创建弹出式“烤面包机”通知

    我正在使用 NET 并创建一个桌面应用程序 服务 当触发某些事件时 它将在桌面的一角显示通知 我不想使用常规的消息框 b c 那样会造成太大的干扰 我希望通知滑入视图 然后在几秒钟后淡出 我正在考虑一种类似于 Outlook 收到新邮件时发
  • .net MVC 将 MP4 流式传输到 iDevice 问题

    我一直在编写用于提供视频服务的一段代码 但遇到了一些问题 代码如下 public ResumingFileStreamResult GetMP4Video string videoID if User Identity IsAuthenti
  • GC.Add MemoryPressure() 如何知道要向哪个对象添加内存压力?

    我最近需要使用GC 添加内存压力 http msdn microsoft com en us library system gc addmemorypressure aspx令我感到奇怪的是 它不接受添加内存压力的对象作为参数 我认为因为它
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 使用 System.Security.Cryptography 将 Win32 Crypto API 调用转换为 C#

    我接到一项任务 要删除我们产品的一个 dll 并将其替换为纯 C 的 dll 旧的 DLL 是 NET 2 0 托管 C C CLI 它包装了对 Win32 本机加密 API 的调用 新的 DLL 应公开具有相同名称和方法的新对象 但应使用

随机推荐

  • 如何通过添加像素跟踪来跟踪各个收件人的阅读状态

    我正在构建一个电子邮件应用程序 其功能是在发送电子邮件后查看已读收件人 例如 如果我向 P1 发送了一封电子邮件并抄送 P2 和 P3 那么当 P1 打开电子邮件时 我作为发件人应该能够看到 P1 阅读了他们的电子邮件 为了实现这一目标 我
  • Firebase DB HTTP API 身份验证:何时以及如何刷新 JWT 令牌?

    我正在尝试使用 HTTP API 将 Python Web 应用程序写入 Firebase DB 我正在使用 Google I O 2016 上推出的新版本 Firebase 到目前为止 我的理解是 我想要完成的特定类型的写入是通过对此类型
  • MySQL字段类型如何转换?

    我已经遇到过转换函数 据我了解 基本语法是 select convert columnName targetFieldType as newColumnName from table 运行此命令不会给我任何错误 但是当我检查数据类型时它们没
  • WebGL 渲染抗锯齿

    我正在使用 webgl 和 javascript 有没有一种方法可以在不使用抗锯齿的情况下进行渲染 我需要每个像素都是纯色的 我当前的片段着色器非常简单 precision mediump float varying highp vec3
  • flutter 中出现无效的互联网地址错误

    我将图像上传到 Firebase Storage 然后获取图像的 Url 到 Firebase Storage 创建的图像链接 然后我将图像的 url 保存在 Firestore Documents 中 如果消息有图像并且当我想显示消息时
  • 您如何解释查询的解释计划?

    当尝试了解 SQL 语句如何执行时 有时建议查看解释计划 在解释 理解 解释计划时应该经历什么过程 什么应该脱颖而出 哦 这工作得很好 与 哦 不 那是不对的 每当我看到关于全表扫描不好而索引访问很好的评论时 我都会感到不寒而栗 全表扫描
  • __builtin_trap:什么时候使用它?

    gcc 提供了额外的内置函数 用于优化 其中之一是void builtin trap void 本质上是通过执行非法命令来中止程序 来自文档 builtin trap函数导致程序异常退出 GCC 实现了这个 通过使用目标相关机制 例如有意
  • SoundCloud API:audiomanager.js 上的 setVolume

    我们在使用 SoundCloud Javascript API 时遇到了 setVolume 函数的问题 踪迹 未捕获的 IndexSizeError 索引或大小为负数 或大于允许的值 音频管理器 js 2 HTML5AudioPlayer
  • SLURM:如何限制CPU作业数量以避免浪费GPU资源

    我们使用 SLRUM 在节点之间共享 CPU 和 GPU 资源 有时 GPU 作业无法提交 因为有人提交了满的 CPU 作业 这样的话 就浪费了GPU资源 我该如何制定政策来避免这种冲突 例如 是否可以限制 GPU 作业节点上的最大 CPU
  • 如何修复“compilerVersion”IIS 错误?

    我收到这个异常 System Configuration ConfigurationErrorsException 的值 提供程序选项中的 compilerVersion 属性必须是 v4 0 或 如果您正在编译 4 0 或更高版本的 NE
  • JMS/消息队列的实际使用? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我刚刚阅读了一些有关 JMS 和 Apache ActiveMQ 的内容 想知道这里的人们使用 JMS 或类似的消息队列技术在现实世界
  • 调用可以抛出错误,但错误不能从全局变量初始值设定项中抛出

    我正在使用 Xcode 7 beta 迁移到 Swift 2 后 我遇到了这行代码的一些问题 let recorder AVAudioRecorder URL soundFileURL settings recordSettings as
  • WordPress 重写仅向页面添加基本前缀

    我在尝试完成一个项目时遇到了一个问题 我将当前的永久链接结构设置为 postname 我创建了自己的函数 只为帖子提供前缀 因此我的帖子被重写为 prefix postname 我的问题是我想更改的永久链接pages正如我对帖子所做的那样
  • 在哪里可以找到 libsystem_c.dylib 的源代码?

    我的堆栈跟踪中有一行奇怪的行 我想进一步调查 12 libsystem c dylib 0x3aa272dc free 168 如果我理解正确的话 libsystem c 是 C 标准库 iOS使用的版本是开源的吗 我在哪里可以获得该来源
  • 使用 nodemailer 发送邮件 - 来自字段的电子邮件不正确

    尝试使用 nodemailer 设置联系表单 这是我的 app js 中的内容 EMail configuration var smtpTransport nodemailer createTransport SMTP service Gm
  • 具有自定义类的多维数组

    我正在寻找一个数组声明 初始化和访问数组 该数组将具有 表 数组 及其行 将如下所示 CusomClass1Instance Number CusomClass2Instance CusomClass1Instance Number Cus
  • 如何在不先创建索引的情况下查询变量字段并应用排序?

    编辑 我简化了问题和示例 因为这个问题仅 一旦您开始使用即适用orderBy 我有一个用户集合 其中每个用户都订阅了许多变量 如下所示 user var1 true var2 true var2 true metric 10 我这样做是因为
  • ssrs 2008级联参数

    我目前正在使用 SQL 2008 R2 和 SQL Server Report Service 2008 我正在使用以下参数创建报告 Staff name Client name Lab lab date 等 当用户选择 Staff 名称时
  • Common Lisp 类型声明未按预期工作

    当我在 Common Lisp 中定义一个函数时 如下所示 defun foo n declare type fixnum n n 42 我期待一个像这样的电话 foo a 立即失败 但在调用时失败 是个declareform 不保证静态类
  • 如何绕过 .NET 中未处理的异常处理来克服 StackOverflowException

    在遇到 NET 中的一些 StackOverflowExceptions 后 我注意到它们完全绕过了 NET 提供的未处理的异常处理程序 Application ThreadException AppDomain UnhandledExce