2013-02-19 68 views
0

我試圖處理異常並保存例外數據庫如何處理異常在.NET

Function1() 
{ 
    try 
    { 
     for(int i=0;i<dt.rows.count;i++) 
     { 
      Function2(); 
     } 
    } 
    catch(exception ex) 
    { 
     saveInDB(ex.message.tostring(),id); 
    } 

} 

Function2() 
{ 
    try 
    { 
     function3() 
    } 
    catch(exception ex) 
    { 
     throw ex; 
    } 
} 

Function3() 
{ 
    try 
    { 
     function4() 
    } 
    catch(exception ex) 
    { 
     throw ex; 
    } 
} 

Function4() 
{ 
    try 
    { 
     code; 
    } 
    catch(exception ex) 
    { 
     throw ex; 
    } 
} 

想我得到了一個方法4例外那麼它將把它給function3-> Function2->功能1和那麼函數1將在數據庫中寫入異常。

但寫入數據庫異常後我想繼續循環。

所以我應該怎麼做?

+0

爲什麼你有一個函數只啓動其他函數? – Vloxxity 2013-02-19 09:47:13

回答

1

但在DB寫異常後,我會繼續爲循環

,通過加入一個(額外)是唯一可行的嘗試裏面的/捕獲的循環。只有在循環的下一輪是獨立的時候,你才應該這樣做,並且你確信對系統沒有損害。

問問自己:在發生未知錯誤之後,我是否還敢將業務數據寫入數據庫?

注意,你的代碼是違反了一些最佳做法:

  • throw ex;重置堆棧跟蹤。將它替換爲throw;
  • 當函數2中的catch塊 - 函數4對異常沒有任何作用時,請將try/catch完全刪除。
0

只要任何try-catch塊引發異常,程序就無法繼續。 如果你希望你的程序是繼續異常處理後,我的建議是不要用:

throw ex; 
1

你可以把你try - catchfor循環體:

Function1() 
{ 
    for(int i=0;i<dt.rows.count;i++) 
    { 
     try 
     { 
      Function2(); 
     } 
     catch(Exception ex) 
     { 
      saveInDB(ex.message.tostring(),id); 
     } 
    } 
} 

請但是,請注意,IO保存到數據庫可能非常不可靠(而且速度很慢)。這反過來可能會導致你的catch拋出進一步的異常,這將推翻你的循環。

因此,將所有拋出的異常存儲在數據結構中並將其立即轉儲到數據庫可能會更好。這種方式循環運行每個和每個行。

Function1() 
{ 
    var errors = new LinkedList<Exception>(); 
    for(int i=0;i<dt.rows.count;i++) 
    { 
     try 
     { 
      Function2(); 
     } 
     catch(Exception ex) 
     { 
      errors.AddLast(ex); 
     } 
    } 
    if(errors.Count > 0) 
    {   
     // now you got all exception in errors and can dump 
     // them in one block 
    } 
} 
+0

感謝它的工作 – 2013-02-20 10:43:51

+0

@TruptiGhorpade很高興閱讀;你能接受一個答案,或將解決方案發布到你的問題上嗎? – 2013-02-20 11:01:00

+0

我不確定我會不會做第二部分並將它們添加到列表中。但如果你能處理它,最好只是抓住它。另外爲了記錄,我推薦這個我工作的oss項目:https://github.com/exceptionless/Exceptionless它已經過測試並且免費。 – 2014-11-12 15:34:37

0

如果需要繼續循環內的異常後循環,你需要下面添加一個try/catchwithin the loop;

try{ 

    for(int i=0; i<10; i++){ 
     try{ 
     //do your work here 
     } 
     catch (Exception e){ 
     //write to db here and then it will continue in the for loop 
     } 
    } 

    //rest of the code 
} 
catch (Exception ex){ 
    //write to db 
} 
+0

感謝它的工作 – 2013-02-20 10:44:12