C# 后台工作程序异常处理
我对如何处理异常有点困惑 我有一个后台工作线程,它运行一些长时间运行的进程。我的理解是,如果后台工作线程发生异常,代码仍将以RunWorkerCompleted方法结束C# 后台工作程序异常处理,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我对如何处理异常有点困惑 我有一个后台工作线程,它运行一些长时间运行的进程。我的理解是,如果后台工作线程发生异常,代码仍将以RunWorkerCompleted方法结束 void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) throw e.Error; 如果是这种情况,在bgWorker.RunWo
void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
throw e.Error;
如果是这种情况,在bgWorker.RunWorkerAsync()周围放置一个try-catch块是否有意义;我想不会吧
我想重新显示在RunWorkerCompleted方法中捕获的异常,如何在不丢失堆栈跟踪的情况下执行此操作-我上面的内容正确吗?我读到当你重新引用一个异常时,你应该只使用“throw”
如果是这样的话,设置try-catch块有什么意义吗
围绕bgWorker.RunWorkerAsync()运行;我想不会吧
不,您不能这样做,因为bgWorker.RunWorkerAsync()代码>它是一种方法(而不是事件
)。
如果您在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;
}
}
我建议您创建一些特定于业务的异常,它描述您在后台执行的操作。并将此异常与原始异常一起作为内部异常抛出:
private void bgWorker_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
throw new BusinessSpecificException("Operation failed", e.Error);
// ...
}
因此,原始异常及其堆栈跟踪将可用,并且您将抛出更具描述性的异常
注意-如果您不想创建新的异常类,可以使用现有的或。但它并没有提供那么多信息,如果你想在某个地方捕捉到它,那么你将无法只捕捉到这个特殊的异常试试这个
void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
throw new Exception("My Custom Error Message", e.Error);
所以在这种情况下,我不需要在RunWorkerCompleted方法中进行任何错误处理?或者,处理RunWorkerCompleted方法中的任何错误是更好的做法吗?如果在工作线程中处理异常,则无法在RunWorkerCompleted中处理该异常,如果在DoWork中不处理该异常,则如果您做错了什么,应用程序可能会崩溃