我想知道最好的方法是“如果所有其他方法都失败了,那就赶上它”。
我的意思是,您正在处理应用程序中尽可能多的异常,但是仍然有一定的错误,因此我需要拥有一些可以捕获所有未处理的异常的东西,以便我可以收集信息并将其存储在数据库中或提交它们到网络服务。
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请 在更高级别处理未处理的Application.ThreadException(WinForms)或DispatcherUnhandledException(WPF)。