什么是实现“捕获所有异常处理程序”的最佳方式
我想知道什么是最好的方法是“如果一切都失败了”。
我的意思是,您在应用程序中尽可能多地处理异常,但仍然一定会出现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"