2015-12-11 70 views
0

我有15個工作線程同時運行。代碼在SSIS包內運行,並且必須保持主線程運行,直到所有工作線程成功完成或終止並出現錯誤。如何處理單個catch塊中工作線程和主線程的異常?

爲了趕上從工作線程的例外,我有一個靜態異常

static Exception Main_Exception = null; 

這是由工作線程更新。

catch (Exception ex) 
      { 
      Main_Exception = ex; 
      } 

檢查Main_Exception的main方法仍然爲null或已經更新。

if (Main_Exception != null) 
         {... } 

對於出現的任何異常,我需要將異常詳細信息插入到錯誤日誌中。我想管理main方法的catch塊中的所有異常。

我設計了以下主要方法。方法是正確的還是錯過了某些東西?在這種情況下,「throw Main_Exception」或「throw」能夠正常工作嗎?

main() 
{ 
    try{ 
     if (Main_Exception != null) 
      { 
       throw Main_Exception; OR throw; 
      } 
    } 
    catch(Exception ex){ 
     //INSERT exception-details into error-log 
    } 
} 

回答

0

您無法管理主應用程序中後臺工作線程拋出的異常。我們將不得不在線程中處理它們。

如果您希望所有的日誌記錄是在一個地方,那麼你將不得不做這樣的事情:

  1. 處理異常線程,收集您需要登錄並保存的信息。
  2. 在監視線程的代碼(即對線程事件作出反應)中,讀取這個錯誤狀態並拋出一個帶有必要信息的新異常。

然後這將被處理並記錄在您的全局異常處理程序中。

+0

爲什麼他不能在主線程中爲他們'.Wait()'(或等待),這會導致他們在主線程中拋出一個'AggregateException',他可以捕獲或只是繼續執行完成? –

+0

chrisf,謝謝你的回答。根據第二個選項,我是否必須手動創建一個新的Ecpetion,然後將它放入if塊中?我的理解是正確的嗎? if(Main_Exception!= null) { throw new Exception(); } – Abhirup

+0

@BenjaminGruenbaum,如果我的任何工作線程中有任何異常,我需要整個SSIS腳本包以錯誤結束。需要的是,我不能等待其他線程的完成。 – Abhirup

0

第一個想法似乎是記錄它自己的線程中的每一個異常。

無論如何,如果您需要跟蹤多個異常,請考慮使用AggregateException類。

而不是你的變量MainThreadException的,你可以保持一個List<Exception> m_AllExceptions(或更好,一個SynchronizedCollection<Exception>,因爲你會從多個線程訪問它) ,然後在主線程檢查異常時,你可以使用的東西,例如:

if (m_AllExceptions.Count > 0 != null) 
{ 
    AggregateException ex = new AggregateException(m_AllExceptions); 
    throw ex; 
}