Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免windows崩溃屏幕_C#_.net_Wpf_Windows - Fatal编程技术网

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()仍然可以使用此窗口。如果它在您设置事件处理程序之前爆炸,您也会得到它。