2013-12-14 50 views
8

我是如何處理的異常略有困惑。後臺工作異常處理

我有一個運行需要長時間運行的過程中後臺工作線程。我的理解是,如果後臺工作線程發生異常,代碼仍然會以RunWorkerCompleted方法結束。

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     if (e.Error != null) 
      throw e.Error; 

如果是這種情況,圍繞bgWorker.RunWorkerAsync()放置一個try catch塊會有什麼意義。打電話,我假設不是?

我想重新拋出被夾在RunWorkerCompleted方法之外,我怎麼能做到這一點,而不會丟失堆棧跟蹤 - 就是我上面是否正確?我在重新拋出一個異常時讀到了你,你應該使用「throw」?

回答

13

我建議你創建一些業務特定的異常,它描述了你在後臺做操作。並與原來的異常拋出此異常的內部異常:

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

因此原來的異常,其堆棧跟蹤將是可用的,你就會有更多的描述拋出異常。

注 - 如果您不想創建新的異常類,則可以使用現有的ApplicationExceptionException。但它不是信息,如果你要抓住它的地方,那麼你就無法趕上這個特殊的例外,只有

2

If this is the case is there any point in putting a try catch block around the bgWorker.RunWorkerAsync(); call, I assume not?

不,你不能這樣做,因爲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; 
      } 



     } 
+0

,所以我不會需要在我的RunWorkerCompleted方法中做任何錯誤處理?或者更好的做法是處理RunWorkerCompleted方法中的任何錯誤? – mHelpMe

+0

如果您在工作線程中處理異常,您將無法在RunWorkerCompleted中獲得該異常,並且如果您在DoWork中未處理該異常,那麼如果您執行了錯誤操作,應用程序可能會崩潰 –

7

在這種情況下,試試這個

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     if (e.Error != null) 
      throw new Exception("My Custom Error Message", e.Error);