为什么AppDomain中异常总是终止应用程序?(Why do AppDomain exceptio

2019-08-01 18:12发布

这是关系到一个先前的问题 。

我想要现在明白是怎么算出来可以终止应用程序,同时非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();            
}

UPDATE
在注释中光这个答案 ,我想澄清的是最重要的,我想了解更多,使UI线程有机会及早赶上未处理通过异常的机制Application.ThreadException机制。 而无论这种行为可能会在非UI线程来实现。

Answer 1:

在谷歌做一些更多的搜索后,我发现,通过描述给予了同样的问题,这非常有趣的解释在他的博客杰夫·阿特伍德 。

大家好,很抱歉的混乱。 这种行为实际上是设计,虽然设计可以有点有时令人费解。

要了解的第一件事是,UnhandledException事件不是未处理的异常“处理程序”。 在登记事件,相反的是该文件说:-(,不会导致未处理的异常进行处理。(从那以后他们就不会未处理的,但我会用循环论证已经停止...) 的UnhandledException事件只是通知您,一个异常已经未处理的 ,如果你想试试你的线程或应用程序死亡。FWIW之前保存的状态,我已经申请到拿到文档修正了一个错误。

只是使事情变得复杂,在1.0和1.1,未处理的异常并不一定意味着你的应用程序会死。 如果发生在比主线程或开始生活在非托管代码中的线程以外的任何未处理的异常时,CLR吃了异常,并允许您的应用程序继续下去。 这是一般的邪恶,因为你会经常发生的是,例如,线程池线程会默默地接一个,都死光了,一个,直到你的应用程序实际上并没有做任何工作。 搞清楚这种失败的原因几乎是不可能的。 这可能就是为什么杰夫以为......他只是总是看到在非主线程崩溃之前,它的工作。

在V2.0中,在任何线程中未处理的异常会关闭应用程序。 我们发现,它的调试崩溃极大比它更容易调试挂起或上述无声停工的工作问题。

顺便说一句,我的1.1机器从MSDN的例子确实有预期的输出; 它只是第二行显示不出来,直到你连接后调试器(或没有)。 在V2我们已经翻转,周围的东西,这样的调试程序连接之前UnhandledException事件触发,这似乎是大多数人的预料。

乔纳森Keljo CLR例外PM乔纳森Keljo于2005年2月18日,下午10时02分

不过,我在UI线程是如何实现让你有一个包罗万象的处理程序为所有UI线程异常的伎俩仍然有兴趣。

甚至, 我的方式来禁用JIT .NET调试对话框只有我的应用程序 (不很感兴趣, 因为在这里看到禁用它的整机 )



Answer 2:

这并不是说所有的AppDomain异常终止应用程序,它是未处理的异常(任何种类)将推倒的AppDomain和终止应用程序。

这里的问题是,你可以显式处理UI线程例外,在一个相当高的水平。 然而,当你有在后台线程未处理的异常,不存在在同一水平容易处理它的意思,所以也容易传播和下拉的应用。 Application.ThreadException可以让你至少知道这是什么原因造成的错误,如果一定记录它。

在UI线程中未处理的异常会导致同样的事情发生。



Answer 3:

这是否帮助呢?

在.NET 2.0提高未处理的异常行为

此外,该代码似乎“死悄悄”。 你在找什么东西?

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);
        }   
    }
}


文章来源: Why do AppDomain exceptions invariably terminate the application?