什么是实现“捕获所有异常处理程序”的最佳方式

我想知道什么是最好的方法是“如果一切都失败了”。

我的意思是,您在应用程序中尽可能多地处理异常,但仍然一定会出现bug,所以我需要有一些能够捕获所有未处理的异常的东西,以便我可以收集信息并将它们存储在数据库中或提交它们到Web服务。

AppDomain.CurrentDomain.UnhandledException事件是否捕获所有内容? 即使应用程序是多线程的?

注意:Windows Vista公开了允许任何应用程序在崩溃后自行恢复的本机API函数......现在不能想到名称......但我宁愿不使用它,因为许多用户仍在使用Windows XP。


我刚刚玩过AppDomain的UnhandledException行为,(这是未处理的异常注册的最后一个阶段)

是的,在处理事件处理程序后,您的应用程序将被终止,并显示令人讨厌的“...程序停止工作对话框”。

:)你仍然可以避免这一点。

查看:

class Program
{
    void Run()
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

        Console.WriteLine("Press enter to exit.");

        do
        {
            (new Thread(delegate()
            {
                throw new ArgumentException("ha-ha");
            })).Start();

        } while (Console.ReadLine().Trim().ToLowerInvariant() == "x");


        Console.WriteLine("last good-bye");
    }

    int r = 0;

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Interlocked.Increment(ref r);
        Console.WriteLine("handled. {0}", r);
        Console.WriteLine("Terminating " + e.IsTerminating.ToString());

        Thread.CurrentThread.IsBackground = true;
        Thread.CurrentThread.Name = "Dead thread";            

        while (true)
            Thread.Sleep(TimeSpan.FromHours(1));
        //Process.GetCurrentProcess().Kill();
    }

    static void Main(string[] args)
    {
        Console.WriteLine("...");
        (new Program()).Run();
    }
}

PS Do处理未处理的更高级别的Application.ThreadException(WinForms)或DispatcherUnhandledException(WPF)。


在ASP.NET中,您可以使用Global.asax文件中的Application_Error函数。

在WinForms中,您使用ApplicationEvents文件中的MyApplication_UnhandledException

如果代码中发生未处理的异常,则会调用这两个函数。 您可以记录异常并从这些函数向用户提供一条好消息。


对于Winform应用程序,除了AppDomain.CurrentDomain.UnhandledException外,我还使用Application.ThreadException和Application.SetUnhandledExceptionMode(w / UnhandledExceptionMode.CatchException)。 这种组合似乎抓住了一切。

链接地址: http://www.djcxy.com/p/52829.html

上一篇: What's the best way to implement a "catch all exceptions handler"

下一篇: Get variable (not hard