UnhandledException事件不起作用
本文关键字:不起作用 事件 UnhandledException | 更新日期: 2023-09-27 18:15:06
我正在编写一个小库,它捕获所有未处理的异常,显示一个小对话框(类似于NF的通常对话框),让用户有机会将异常发送给开发人员。为此,我使用AppDomain的unhandleexception - 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();
};
效果很好。有人知道为什么这不起作用吗?
可能有两个原因。
一个是你没有正确设置UnhandledExceptionMode:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
另一个是你没有处理ThreadException,抛出的异常不是一个未处理的异常,而是一个线程异常。
下面是一个示例,您需要根据您的场景修改它:
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());
根据我的经验,这行不通:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1Load(object sender, EventArgs e)
{
Application.ThreadException += ApplicationThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
}
void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
{
//throw new NotImplementedException();
}
void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//throw new NotImplementedException();
}
}
[STAThread]
static void Main()
{
Application.ThreadException += ApplicationThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//throw new NotImplementedException();
}
static void ApplicationThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
//throw new NotImplementedException();
}
也许有必要在Application.Run()