一尘不染

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

c#

我想知道最好的方法是“如果所有其他方法都失败了,那就赶上它”。

我的意思是,您正在处理应用程序中尽可能多的异常,但是仍然有一定的错误,因此我需要拥有一些可以捕获所有未处理的异常的东西,以便我可以收集信息并将其存储在数据库中或提交它们到网络服务。

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

旁注:Windows
Vista公开了本机API函数,该函数允许任何应用程序在崩溃后恢复自身…现在想不起来的名称…,但我宁愿不使用它,因为我们的许多用户仍在使用Windows
XP。


阅读 191

收藏
2020-05-19

共1个答案

一尘不染

我刚刚玩过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请
在更高级别处理未处理的Application.ThreadException(WinForms)或DispatcherUnhandledException(WPF)。

2020-05-19