.net 为什么AppDomain异常总是终止应用程序?

.net 为什么AppDomain异常总是终止应用程序?,.net,exception-handling,thread-exceptions,.net,Exception Handling,Thread Exceptions,这是与一个问题有关的 我现在想了解的是,为什么可以阻止UI线程异常终止应用程序,而不能阻止非UI异常 有关参考,请参阅 最重要的是,在这种情况下,我希望能够“静默”终止进程,而不显示询问是否要发送错误报告的Windows对话框 这是我的AppDomain UnhandledExceptionHandler: private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs

这是与一个问题有关的

我现在想了解的是,为什么可以阻止UI线程异常终止应用程序,而不能阻止非UI异常

有关参考,请参阅

最重要的是,在这种情况下,我希望能够“静默”终止进程,而不显示询问是否要发送错误报告的Windows对话框

这是我的AppDomain UnhandledExceptionHandler:

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{            
    try
    {
        // Maybe do some logging here if allowed
    }
    catch
    {
    }

    // then just terminate the application
    Application.Exit();            
}
更新

根据中的评论,我想澄清一下,最重要的是,我想了解更多有关使UI线程能够尽早通过
应用程序.ThreadException
机制捕获未处理异常的机制的信息。以及这种行为是否可以在非UI线程上实现。

不是任何AppDomain异常都会终止应用程序,而是未处理的异常(任何类型)会破坏AppDomain并终止应用程序

这里的问题是,您可以在相当高的级别上显式地处理UI线程异常。但是,当后台线程中存在未处理的异常时,无法在同一级别轻松处理它,因此它往往会向上传播并拉低应用程序。Application.ThreadException允许您至少知道这是导致错误的原因,并在必要时记录它

UI线程中未处理的异常将导致同样的情况发生。

这有帮助吗

此外,这段代码似乎“悄然消亡”。你在找别的东西吗

using System;

namespace UnhandledException
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;

            throw new NotImplementedException();
        }

        static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Exception exception = (Exception)e.ExceptionObject;
            System.Console.WriteLine("exception=[" + exception.ToString() + "]");

            Environment.Exit(-1);
        }   
    }
}

在谷歌上做了更多的搜索之后,我发现了这个非常有趣的解释,这个解释与作者描述的问题是一样的

大家好, 很抱歉给你带来了困惑。这种行为实际上就是设计,尽管设计有时会有点复杂

首先要了解的是,UnhandledException事件不是一个未处理的异常“处理程序”注册事件,与文档中所述相反:-(,不会导致未处理的异常被处理。(从那时起,它们不会被未处理,但我将停止循环推理…)UnhandledException事件只是通知您异常未处理,以防您想在线程或应用程序死亡之前保存状态。FWIW,我已提交了一个bug以修复文档

让事情更复杂的是,在v1.0和1.1中,未经处理的异常并不总是意味着应用程序将死亡。如果未经处理的异常发生在主线程或以非托管代码开始其生命周期的线程以外的任何线程上,CLR会处理该异常并允许应用程序继续运行。这通常是邪恶的,因为什么例如,经常会发生的情况是,线程池线程会一个接一个地悄无声息地消失,直到你的应用程序实际上没有做任何工作。找出这种失败的原因几乎是不可能的。这可能就是为什么Jeff以前认为它行得通的原因……他总是看到非主线程崩溃

在v2.0中,任何线程上未经处理的异常都会关闭应用程序。我们发现,调试崩溃比调试上述挂起或静默停止工作问题要容易得多

顺便说一句,在我的1.1机器上,来自MSDN的示例确实具有预期的输出;只是第二行直到您附加了调试器(或未附加调试器)之后才显示。在v2中,我们将事情翻转过来,以便在调试器附加之前触发未处理的异常事件,这似乎是大多数人所期望的

乔纳森·凯尔乔 CLR异常PM Jonathan Keljo于2005年2月18日晚上10:02

然而,我仍然感兴趣的是UI线程如何实现允许您拥有一个针对所有UI线程异常的全面处理程序的技巧


更重要的是,我对一种只为我的应用程序禁用.NET JIT调试对话框的方法非常感兴趣(没有)

@Reed:“UI线程中未经处理的异常将导致同样的事情发生。”-这不是真的。请创建一个测试应用程序并亲自尝试。技术上,我应该这么说“主线程上未处理的异常”。Windows窗体在UI线程上添加自己的异常处理行为(因为它完全在UI线程上运行)这会改变主线程的行为。制作一个控制台应用程序,然后尝试一下,你会发现不管在哪个线程上发生什么事情,它们都会破坏应用程序。然后我应该重申我的问题:UI线程如何完成它的一般异常处理行为?我是否可以将其复制为行为非UI线程?@Miky D:您需要捕获每个线程上的异常。请记住,任何可能在幕后创建的线程都不需要自己手动启动线程。嗯,@Max和@Reed,显然不是所有UI函数本身都包含异常处理程序,但异常是由catch all application.ThreadEx捕获的什么是“捕获”(双关语)??是的,是的。当你发布时,我刚读完帖子和评论。+1然而。+1。是的,环境。退出似乎起到了作用!我将把问题留一段时间,看看是否有人能深入了解UI线程如何实现“一网打尽”例外。否则,我将投票支持接受的例外nswer!Application.ThreadException只是“未处理异常处理程序”的另一个变体。有许多变体(控制台应用程序与WinForms、WebForms与WCF等).我不确定我是否理解你的问题。一般来说,我实现了每一个适用的。需要记住的是:Environment.Exit终止整个过程,因此如果你应用