我有一个后台工作程序会在出现问题时抛出异常。我试图在工作完成的事件中捕获异常。
我的代码大致如下:
void workerProcessReports_DoWork(object sender, DoWorkEventArgs e)
{
try
{
//Work is here. The code here throws an exception
}
catch (Exception ex)
{
throw ex;
}
}
void workerProcessReports_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show("There was a problem");
}
else
{
MessageBox.Show("No Problems");
}
}
问题在于,visual studio使用Message
打破了dowork方法中的throw exInvalidOperationException未被用户代码
处理
发生了什么?
答案 0 :(得分:4)
不要抓住并重新抛出同样的异常,这是一种浪费,会导致堆栈跟踪混乱。
如果要从父异常类型中捕获完全相同的异常,只需在catch块中写入throw;
即可。如果你打算一直扔掉所有东西,一开始就不要去抓它。
如果您确实允许在doWork
方法中处理异常而发生异常,那么您可以使用RunWorkerCompleted
方法中的父线程。
在RunWorkerCompleted方法中,您可以抛出它:
if(e.Error != null)
{
throw e.Error;
}
然而,在这一点上,如果它能够处理你可能只想恢复并继续,而不是抛出,因为你已经意识到发生了异常。特别是,如果这个父线程是你的UI线程,那么这是显示错误消息而不是抛出并可能导致应用程序崩溃的非致命错误的绝佳机会。