专栏首页walterlv - 吕毅的博客配置 legacyUnhandledExceptionPolicy 防止后台线程抛出的异常让程序崩溃退出

配置 legacyUnhandledExceptionPolicy 防止后台线程抛出的异常让程序崩溃退出

配置 legacyUnhandledExceptionPolicy 防止后台线程抛出的异常让程序崩溃退出

发布于 2017-10-16 12:52 更新于 2017-10-26 10:51

legacyUnhandledExceptionPolicy 可以防止程序在后台线程抛出异常后崩溃退出。

如果你的程序抛了异常,你是怎么处理的呢?等待程序崩溃退出?还是进行补救?

如果是做 UI 开发,很容易就找到 Dispatcher.UnhandledException 事件,然后在事件中进行补救。如果补救成功,可以设置 e.Handled = true 来阻止异常继续让程序崩溃退出。但是,如果是后台线程抛出了异常呢?并没有 Dispatcher 可以用。所以我们就束手就擒让程序自己退出吗?


WPF 和 Windows Forms 都是微软的框架,为了照顾初学者,微软会默认每一个开发者都不会正确地处理异常。于是在异常发生之后,微软 Windows 会假设开发者并不知道如何应对以便让应用程序正常工作,就擅自将应用程序进程结束掉,以便防止应用程序自己内部产生奇怪的状态和错误,避免对系统环境造成不可逆的严重后果。

能够写出异常处理代码的开发者,微软会默认他们懂了异常处理。

写出了监听 Dispatcher.UnhandledException 事件的开发者,微软会认为他们已经学会了如何在 UI 线程中处理异常。于是允许开发者设置 e.Handled = true 来标记异常已被正确处理,程序可以不用退出了。

还有一个事件 Appdomain.CurrentDomain.UnhandledException,然而这个事件却并不允许开发者标记 e.Handled = true。因为微软认为,应用程序域中所有的线程发生异常都会进入这个事件中,大多数开发者都不明白这些线程这些异常是怎么回事,所以不认为这些开发者具备正确处理这些异常的能力。比如 WPF 的触摸模块发生了异常,开发者知道如何恢复吗?并不知道,还不如结束掉程序然后重启呢!

在这个事件中,有一个属性 IsTerminating 指示是否应用程序正因为这次异常准备退出,不过开发者并不能拿这个属性做些什么。

但还是要照顾更高级的开发者的,于是祭出新的配置——legacyUnhandledExceptionPolicy

app.config 文件的 <runtime> 节点中添加如下代码:

<legacyUnhandledExceptionPolicy enabled="1"/>  

加上了这个配置之后,Appdomain.CurrentDomain.UnhandledException 事件的 IsTerminating 就变成了 false 啦!也就是说,程序并不会因为这次的异常而崩溃退出。

既然你通过这个配置节点于微软达成了契约,你就需要好好地在 Appdomain.CurrentDomain.UnhandledException 事件中写好异常的恢复逻辑。如果不好好恢复,小心有些致命的异常会导致你的程序出现雪崩式的错误,最终 Windows 还是会通过 CorruptedStateException 把你干掉的!


参考资料

本文会经常更新,请阅读原文: https://walterlv.com/post/prevent-app-crash-by-background-thread.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 让控制台支持 ANSI 转义序列,输出下划线、修改颜色或其他控制

    发布于 2018-08-05 06:24 更新于 2018-09...

    walterlv
  • 将 svn 仓库迁移到 git 仓库

    我找到了一个很久很久以前编写的项目,然而当时是使用 svn 进行版本管理的。然而现在的版本管理全部是 git,不愿意再装一个 svn 工具来管理这...

    walterlv
  • 用 AppContext 解决类库的更新兼容问题

    2017-09-30 15:45

    walterlv
  • 由优劣语言之争引起的思考

    作为高级工程师和架构师圈子里有着出色影响力的优秀公众号,在公开场合发表这种充满意识形态的争议性文字,实属罕见,我觉得应该是小编未能注意到作者在正文的某个角落夹杂...

    歪脖贰点零
  • 赔付 1.5 亿元!七天七夜,微盟被删除的数据全面找回:放弃自建数据库,全面上云

    截止到3月1日晚8点,在腾讯云团队协助下,经过7*24小时的努力,我们数据已经全面找回,由于此次数据量规模非常大,为了保证数据一致性和线上体验,我们将于3月2日...

    乔戈里
  • 工信部公开征求《网络数据安全标准体系建设指南》意见,2021年将初步建立网络数据安全标准体系

    “后台回复关键词“指南”可下载获取工信部发布的万字完整版《网络数据安全标准体系建设指南(征求意见稿)》以及公示意见反馈信息表。

    数据猿
  • 堕落 Java vs 新贵 Python,2018 年最应该学习哪一门编程语言?

    关键时刻,第一时间送达! 2017 年,编程语言领域发生了巨大的变化,一方面,Java、Kotlin 等语言在企业和移动开发方面吸引了很多开发者的关注;另一方面...

    企鹅号小编
  • 哪里的云服务好,选择腾讯云的理由(价格优惠实用)

    现在的云服务器种类众多,配置参数项目也比较多。新用户在选择云服务器哪家好时,会想着云服务器哪家好?对于要购买云服务器的用户来说,面对众多的商家品牌,很难确定到底...

    勤劳的小蜜蜂
  • 为什么C语言屹立不倒?

    近年来,谷歌一直致力于开发出自己的编程语言以取代当今世上最常用的C、C++和JavaScript。在系统语言方向,谷歌的Go语言能够为用户在数据中心内建立大型软...

    程序员互动联盟
  • 顺序存储线性表的实现

    最近复习数据结构,写了一个顺序存储的线性表,代码粘在这里:) 代码下载:git@github.com:Wang-Sen/algorithm.git /* * ...

    用户1214695

扫码关注云+社区

领取腾讯云代金券