我有一个带有ThreadExceptionHandler的测试winforms应用程序,当捕获到未处理的异常时会显示一个消息框,如下所示:
[STAThread]
static void Main()
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show("error caught");
}
当我强制表格1的ctor(例如dividebyzero)中的错误时如下:
public Form1()
{
InitializeComponent();
int i = 0;
int x = 5 / i;
}
并在Visual Studio之外运行应用程序(在Windows 7中),除以零的异常是而不是处理 - 我得到了一个无用的“WindowsFormApplication1已经停止工作......”消息。
但是,当我将dividebyzero异常移到Form1_Load事件并重新运行时,异常处理得当。
有人可以解释为什么会这样吗?我运行此测试程序的原因是因为我在另一个企业应用程序中遇到类似的未处理异常问题,我正在尝试跟踪它。
答案 0 :(得分:4)
这可能是因为在调用Application.Run()
之前执行了构造函数。您的代码也可以写成
[STAThread]
static void Main()
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 MyForm = new Form1();
Application.Run(MyForm);
}
您的线程异常处理程序仅在Application.Run()
执行时变为活动状态。为了捕获表单构造函数中的异常,您需要将Form1 MyForm = new Form1();
包围一个单独的try / catch块。
答案 1 :(得分:3)
错误是在构造函数中引发的,而不是在线程代码中引发的。你的代码:
Application.Run(new Form1());
将在调用Application.Run()
之前,在那一行代码上抛出异常,因此线程代码甚至不会开始执行。
答案 2 :(得分:1)
ThreadException处理异常UI线程异常。 UnhandledException处理非UI线程异常。
您需要将此行添加到Main():
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
以及您班级的以下内容:
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show("error caught 2");
}
答案 3 :(得分:0)
每次Application抛出异常时都会调用Application.ThreadException事件,但是在您的示例中,主线程中会抛出异常,您可以为它添加try catch块。