后台工作者异常处理

mHe*_*pMe 9 c# multithreading backgroundworker

我对如何处理异常感到有些困惑.

我有一个后台工作线程,运行一些长时间运行的进程.我的理解是,如果后台工作线程发生异常,代码仍将以RunWorkerCompleted方法结束.

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

        if (e.Error != null)
           throw e.Error;
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,那么在bgWorker.RunWorkerAsync()周围放置一个try catch块是有意义的.打电话,我猜不是吗?

我想重新抛出RunWorkerCompleted方法中捕获的异常,如何在不丢失堆栈跟踪的情况下执行此操作 - 我上面的内容是否正确?我读过你,当你重新抛出异常时,你应该只使用"抛出"?

Ser*_*kiy 13

我建议你创建一些特定于业务的异常,它描述了你在后台进行的操作.并将此异常作为内部异常抛出原始异常:

private void bgWorker_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
        throw new BusinessSpecificException("Operation failed", e.Error);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

因此,其堆栈跟踪的原始异常将可用,并且您将抛出更多描述性异常.

注 - 如果您不想创建新的异常类,则可以使用现有的ApplicationExceptionException.但它不是那么有用,如果你要在某个地方捕捉它,那么你将无法仅捕获这个特殊的例外


Jad*_*ade 7

试试这个

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

        if (e.Error != null)
           throw new Exception("My Custom Error Message", e.Error);
Run Code Online (Sandbox Code Playgroud)