为什么我的异常在wpf应用程序中没有任何区别?

时间:2013-05-17 16:14:08

标签: c# wpf exception-handling event-handling backgroundworker

我有一个BackgroundWorker的WPF应用程序。我在这个BGW中抛出一个异常,但它没有显示在任何地方!,只是后台工作者触发它的WorkerFinished事件。

它到底在哪里?

2 个答案:

答案 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();