我已经查看了一些关于如何解决此问题的帖子,但我无法完全理解这种异常行为的原因。
简短版本:
为什么在 RunWorkerCompleted 事件中抛出的 Exception 不会被调用代码捕获?
详细版本:
- 我有一个 BackgroundWorker(以下简称 BGW)。 - BGW 的 DoWork 事件抛出一个 Exception。 - BGW 的 RunWorkerCompleted 事件捕获该 Exception,并记录并进行一些很酷的清理工作。 - 在清理后,RunWorkerCompleted 事件重新抛出了该 Exception。 如果 RunWorkerCompleted 事件在主线程上运行,那么这不意味着调用代码(也在主线程上)应该能够捕获该异常吗? - 一些代码来强化这个概念...
我认为像这样调用
简短版本:
为什么在 RunWorkerCompleted 事件中抛出的 Exception 不会被调用代码捕获?
详细版本:
- 我有一个 BackgroundWorker(以下简称 BGW)。 - BGW 的 DoWork 事件抛出一个 Exception。 - BGW 的 RunWorkerCompleted 事件捕获该 Exception,并记录并进行一些很酷的清理工作。 - 在清理后,RunWorkerCompleted 事件重新抛出了该 Exception。 如果 RunWorkerCompleted 事件在主线程上运行,那么这不意味着调用代码(也在主线程上)应该能够捕获该异常吗? - 一些代码来强化这个概念...
private void SomeMethod()
{
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += bgw_DoWork;
bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
bgw.RunWorkerAsync();
}
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
throw new Exception("Oops");
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Error != null)
{
// Log exception & cleanup code here...
throw e.Error; // Always unhandled :(
}
}
我认为像这样调用
SomeMethod
会捕获Exception
并显示消息框,但是BGW的行为与我预期的不同,Exception
始终未处理...try
{
SomeMethod();
}
catch (Exception)
{
MessageBox.Show("Handled exception");
}