我正在编写一个小库,它捕获所有未处理的异常,显示一个小对话框(类似于 NF 的常见对话框),使用户有机会将异常发送给开发人员。为此,我使用 AppDomain 的 UnhandledException-Event,如下所示:
app.UnhandledException += (object sender, UnhandledExceptionEventArgs e) =>
{
ExceptionHandler handler = new ExceptionHandler((Exception)e.ExceptionObject, ExEntry);
UnhandledExceptionListened(handler);
if (Properties.Settings.Default.ShowStandardExceptionDialog)
{
ExceptionDialog exdialog = new ExceptionDialog(handler);
exdialog.ShowDialog();
}
};
ExceptionHandler 和 ExEntry 是我的库的类。但是:如果发生异常,编译器会跳转到我的 Lambda 表达式,尝试调试第一行代码,然后显示之前发生的错误,而不处理 lambda 的其余部分。
但如果我只是写:
app.UnhandledException += (object sender, UnhandledExceptionEventArgs e) =>
{
ExceptionDialog exdialog = new ExceptionDialog(handler);
exdialog.ShowDialog();
};
它工作得很好。有谁知道为什么这不起作用?
可能有两个原因。
一是你没设置未处理异常模式 http://msdn.microsoft.com/library/system.windows.forms.unhandledexceptionmode.aspx适当地:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
另一个是你没有处理好线程异常 http://msdn.microsoft.com/library/system.windows.forms.application.threadexception.aspx,并且抛出的异常不是未处理的异常,而是线程异常。
以下是一个示例,您需要根据您的场景进行修改:
Application.ThreadException+=
new ThreadExceptionEventHandler(Log.WriteThreadException);
AppDomain.CurrentDomain.UnhandledException+=
new UnhandledExceptionEventHandler(Log.WriteUnhandledException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)