我对如何处理异常感到有些困惑。
我有一个后台工作线程,它运行一些长时间运行的进程。我的理解是,如果后台工作线程发生异常,代码仍将以RunWorkerCompleted方法结束。
void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
throw e.Error;
如果是这种情况,那么在bgWorker.RunWorkerAsync()周围放置一个try catch块是有意义的。打电话,我猜不是吗?
我想重新抛出RunWorkerCompleted方法中捕获的异常,如何在不丢失堆栈跟踪的情况下执行此操作 - 我的上述内容是否正确?我读到你在重新抛出异常时应该使用“throw”吗?
答案 0 :(得分:13)
我建议你创建一些特定于业务的异常,它描述了你在后台进行的操作。并将此异常作为内部异常抛出原始异常:
private void bgWorker_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
throw new BusinessSpecificException("Operation failed", e.Error);
// ...
}
因此,可以使用其堆栈跟踪的原始异常,并且您将获得更多描述性异常。
注意 - 如果您不想创建新的异常类,则可以使用现有的ApplicationException或Exception。但它不是那么有用,如果你要在某个地方捕捉它,那么你将无法仅仅抓住这个特殊的例外
答案 1 :(得分:7)
试试这个
void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
throw new Exception("My Custom Error Message", e.Error);
答案 2 :(得分:2)
如果是这种情况,那么放置try catch块是否有任何意义 围绕bgWorker.RunWorkerAsync();打电话,我猜不是吗?
不,你不能这样做是因为bgWorker.RunWorkerAsync();
它是一种方法(不是an event
)。
如果您在Visual Studio调试器下运行,则调试器将在DoWork事件处理程序中出现未处理的异常的位置中断。
所以你可以做这样的事情
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
//put your break point here
// here you can capture your exception
}
catch (Exception ex)
{
// here catch your exception and decide what to do
throw;
}
}