C# 如何避免windows崩溃屏幕
我们有C# 如何避免windows崩溃屏幕,c#,.net,wpf,windows,C#,.net,Wpf,Windows,我们有未处理的ExceptionEventHandler,该处理程序捕获了意外异常。但是为什么我们仍然看到下面的屏幕?我想如果我们处理了这个异常,它就不会出现在操作系统上。如果没有异常到达系统级别,为什么该屏幕仍然显示 单击“调试”按钮查看异常的来源 如果您没有立即看到它,请在VisualStudio中启动应用程序,转到“调试、异常”对话框,然后检查所有异常。然后重新运行应用程序,每次调试器告诉您遇到第一次意外异常时都调查代码,如果Visual Studio询问您是否要执行此操作,则将异常传递给
未处理的ExceptionEventHandler
,该处理程序捕获了意外异常。但是为什么我们仍然看到下面的屏幕?我想如果我们处理了这个异常,它就不会出现在操作系统上。如果没有异常到达系统级别,为什么该屏幕仍然显示
单击“调试”按钮查看异常的来源 如果您没有立即看到它,请在VisualStudio中启动应用程序,转到“调试、异常”对话框,然后检查所有异常。然后重新运行应用程序,每次调试器告诉您遇到第一次意外异常时都调查代码,如果Visual Studio询问您是否要执行此操作,则将异常传递给应用程序
这将帮助您找到问题的根源。在某些情况下,未处理的异常将不会由未处理的ExceptionEventHandler处理。例如,System.Timers.Timer正在吞咽异常,因此它们不会传播到未处理的ExceptionEventHandler。向
AppDomain注册未处理的ExceptionEventHandler
。未处理的异常
并不意味着未处理的异常会得到处理。相反,它是一种能够记录异常和相关程序状态的机制,以帮助以后的调试。异常将保持未处理状态,并且将调用Windows错误报告
实际上,当调用此事件时,处理异常“为时已晚”。假设您可以告诉运行时继续执行,那么执行将在哪里展开?调用堆栈上没有一个帧希望处理该异常。充其量只能终止正在执行的线程;但是如果它在唯一的前台线程上呢?最好将未处理的异常传播到操作系统的默认未处理异常筛选器,并让它调用Windows错误报告
使用一些附加注释进行编辑:现在,您希望设计为抗崩溃的某些应用程序,例如长时间运行的服务进程。在某些情况下,添加“catch all”*异常处理程序可能是有意义的,例如执行作业的作业队列,如果单个作业因未处理的异常而失败,则无关紧要;我们记录问题并继续下一项工作。然而,Main中的根catch-all处理程序没有什么意义:您的整个应用程序现在处于未知状态。您可以记录异常并终止,但您可能会错过Windows错误报告的好处:事后小转储和一个简单的按钮(该对话框上的“调试”按钮)来调用注册的JIT调试器,该调试器将直接引导您解决问题。对于大多数软件,我的建议是让你的软件崩溃;在你的脸上,带有迷你转储的bug通常是最容易修复的
*有些异常本质上是“不可修补的”,例如
StackOverflowException
。其他异常(如AccessViolationException
)是可捕获的,但本质上表示严重的程序状态不一致(无法从预期内存位置读取或写入)。尝试从此类异常中恢复从来都不是一个好主意。这是因为未处理的异常发生在主线程中,对此几乎没有什么可做的。检查这篇文章:
几乎什么都没有,是的,因为您仍然可以在应用程序上捕获该异常。运行级别。此时,您的应用程序已经死机,但至少您可以“避免windows崩溃屏幕”,并实现自己的崩溃屏幕:
static void Main()
{
try
{
Application.Run(new Form1());
}
catch (Exception ex)
{
MessageBox.Show("Oops! Can I has " + ex.Message + "?");
}
}
您正在使用多个AppDomain吗?无法处理该异常。不调用Environment.Exit()仍然可以使用此窗口。如果它在您设置事件处理程序之前爆炸,您也会得到它。