【发布时间】:2011-07-11 08:30:47
【问题描述】:
我似乎无法正确处理意外异常。
考虑以下应用:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SomeForm());
}
class SomeForm : Form
{
public SomeForm()
{
Button btn = new Button();
btn.Text = "Click ME";
btn.Location = new System.Drawing.Point(20, 20);
btn.Click += new EventHandler(btn_Click);
Controls.Add(btn);
}
void btn_Click(object sender, EventArgs e)
{
throw new Exception("This is an Exception");
}
}
如果我运行此应用程序并单击按钮,我会按预期收到未处理的异常。起初,我尝试使用如下所示的 try catch 块围绕 Application.Run:
try { Application.Run(new SomeForm()); }
catch { MessageBox.Show("Exception caught in try catch"); }
起初这似乎可行,直到我在调试器之外运行应用程序。当您在调试器之外运行应用程序时,异常会报告为未处理的错误。在做了一些阅读之后,我发现我应该查看 Application.ThreadException 事件。所以我做了以下事情:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
try { Application.Run(new SomeForm()); }
catch { MessageBox.Show("Exception caught in try catch"); }
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show("Exception caught in event");
}
现在,当我在调试器之外运行我的应用程序时,会处理异常并且 MessageBox 指示它在事件处理程序中被捕获。然后我回到调试器并运行它。现在调试器将它作为一个未处理的异常启动,即使我已经将它包围在一个 try catch 中并且我被绑定到 Application.ThreadException 事件。如果我不绑定到 Application.ThreadException 事件,try catch 块会正确捕获异常。
现在回答问题:
- 这到底是怎么回事?
- 有没有一种方法可以捕获/处理我的应用程序中的所有异常,这些异常既可以在调试器中也可以在调试器之外运行?
- 我在这里做错了吗?
【问题讨论】: