【发布时间】:2010-09-25 17:44:28
【问题描述】:
我在抛出异常并在Application.ThreadException 事件处理程序中捕获它们时看到一些奇怪的行为。
下面的示例中发生的基本上是在BackgroundWorker 的DoWork 事件处理程序中引发了异常。 RunWorkerCompleted 事件处理程序重新抛出一个新异常,并将原始异常作为内部异常。
为什么在ThreadException 事件处理程序中出现内部异常,而不是实际抛出的异常?如果我没有在 RunWorkerCompleted 事件处理程序中提供内部异常,则会显示正确的异常。
using System;
using System.Windows.Forms;
using System.ComponentModel;
namespace WierdExceptionApp
{
class WierdExceptionForm : Form
{
BackgroundWorker worker = new BackgroundWorker();
public WierdExceptionForm()
{
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
throw new Exception("worker_RunWorkerCompleted", e.Error);
}
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
throw new Exception("worker_DoWork");
}
[STAThread]
static void Main()
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.Run(new WierdExceptionForm());
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
}
}
}
【问题讨论】:
-
令人震惊;在我没有意识到的情况下,这一直在咬我多年。对于我可以发誓我处理过的事情,我会看到这些偶尔出现的错误报告。它们非常罕见,以至于没有花很多时间研究它们,但最终它开始发生在一些重要的事情上,我意识到例外情况正在发生变化。 WTF??
标签: c# winforms multithreading exception-handling