如何避免Windows崩溃屏幕

5Yr*_*DBA 2 .net c# windows wpf

我们已经UnhandledExceptionEventHandler到位,并且该处理程序捕获了意外的异常.但为什么我们仍然会看到以下屏幕?我想如果我们处理了异常,它就不会进入操作系统.如果没有异常达到系统级别,为什么该屏幕仍然显示?

在此输入图像描述

Pet*_*ene 7

注册UnhandledExceptionEventHandlerwith AppDomain.UnhandledException并不意味着处理未处理的异常.相反,它是一种能够记录异常和相关程序状态以帮助以后调试的机制.该异常将保持未处理状态,并将调用Windows错误报告.

实际上,当调用此事件时,处理异常"为时已晚".假设你可以告诉运行时继续执行,执行放松到哪里?调用堆栈上没有一个帧想要处理异常.最多,执行线程可以终止; 但是,如果它是唯一的前台线程呢?最好将未处理的异常传播到操作系统的默认未处理异常过滤器,并让它调用Windows错误报告.

使用其他一些注释进行编辑:
现在,您要设计的某些应用程序可以防止崩溃,例如长时间运行的服务进程.在某些情况下添加"catch-all"*异常处理程序可能是有意义的,例如执行作业的作业队列,如果单个作业因未处理的异常而失败则无关紧要; 我们记录问题并继续下一份工作.但是,像Main这样的root catch-all处理程序没什么意义:你的整个应用程序现在处于未知状态.你可以记录异常并终止,但是你会错过Windows错误报告的好处:事后minidumps和一个简单的按钮(该对话框上的"Debug"按钮)来调用将要注册的注册JIT调试器你直接解决了这个问题.对于大多数软件,我的建议是简单地让你的软件崩溃; 带有小型转储的面对面错误通常是最容易解决的问题.

*一些例外本质上是"无法捕获的",例如a StackOverflowException.其他的,例如AccessViolationException可捕获的,但本质上表示严重的程序状态不一致(无法从预期的存储位置读取或写入).尝试从此类异常中恢复绝不是一个好主意.