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)
因此,其堆栈跟踪的原始异常将可用,并且您将抛出更多描述性异常.
注 - 如果您不想创建新的异常类,则可以使用现有的ApplicationException或Exception.但它不是那么有用,如果你要在某个地方捕捉它,那么你将无法仅捕获这个特殊的例外
试试这个
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)