我有一个BackgroundWorker
的WPF应用程序。我在这个BGW中抛出一个异常,但它没有显示在任何地方!,只是后台工作者触发它的WorkerFinished
事件。
它到底在哪里?
答案 0 :(得分:7)
每个线程都有自己的调用堆栈;异常只能向上移动自己的调用堆栈,它们无法“渗透”到另一个线程的调用堆栈中。
当您的异常冒泡到启动DoWork
事件处理程序的BackgroundWorker代码时,异常将最终被明确捕获并存储在Error
属性中,而不是允许它到达顶部调用堆栈并使应用程序崩溃。
如果您希望程序在您的BGW抛出异常时结束,那么您将需要处理已完成的事件,检查异常,然后重新抛出它或抛出新的异常。
答案 1 :(得分:4)
看这里,有一个很好的例子。在RunWorkercompleted
中抛出的异常Unhandled exceptions in BackgroundWorker
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
if(e.Error != null)
{
MessageBox.Show("There was an error! " + e.Error.ToString());
}
};
worker.RunWorkerAsync();