C#中try catch中throw ex和throw方式拋出異常有何不同_異常捕獲堆棧丟失問題


  前言,最近遇到一個使用try-catch異常捕獲后記錄一下日志,然后再拋出該異常后,異常堆棧里無法顯示准確的堆棧地址的問題?   其實以前也遇到過類似問題,沒有重視,這次好好研究了下,並上度娘上找了找其他道友的文章一起看了,發現處理方式的不同的確會有影響!下面會詳細介紹:

  推薦使用:原始異常拋出寫法(throw;),重點1!我們主要看初始的異常堆棧及錯誤信息,捕獲異常的位置,一般會記錄一些請求數據等。

  我常用的使用try-catch捕獲異常重新拋出的代碼方式:

1 try{
2   //代碼塊  
3 }catch(Exception ex){
4   //日志處理
5   this.Logger.LogDebug(ex, $"記錄異常");
6   throw ex;  
7 }

 

這用方式乍一看感覺沒啥問題,我將異常做了日志處理后,直接又拋出去了,但是最終的異常堆棧里只顯示了是在第6行拋出的異常,但是其實異常的位置應該是在第2行的代碼塊位置。我查了一位道友的文章發現,這種寫法是有問題的,會導致初始的堆棧丟失!

 

  划重點1-原始異常拋出:   將第5行的異常捕獲改為:使用throw;接力拋出,而不是使用throw ex;  最終的異常信息顯示的是和你沒有使用try-catch處理是一樣的。

    參考代碼:

try{
    //代碼塊 1 
}catch(Exception ex1){
    //日志處理
    this.Logger.LogDebug(ex, $"記錄異常");
    throw;  
}

 

  划重點2-嵌套異常拋出:  將第5行的異常捕獲改為: 使用new Exception("test new error message",ex);     通過new一個新的異常,將ex放入內部異常參數中即可保留原始異常信息。

    參考代碼:

try{
  //代碼塊1
}catch(Exception ex){
  //日志處理
  this.Logger.LogDebug(ex, $"記錄異常");
  throw new Exception("test error",ex)    
}

  當然也可以使用多層嵌套。

  效果如下:

  

 

  參考道友文章:C#中try catch中throw ex和throw方式拋出異常有何不同


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM