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

  前言,最近遇到一個使用try-catch異常捕獲後記錄一下日誌,而後再拋出該異常後,異常堆棧裏沒法顯示準確的堆棧地址的問題?   其實之前也遇到過相似問題,沒有重視,此次好好研究了下,並上度娘上找了找其餘道友的文章一塊兒看了,發現處理方式的不一樣的確會有影響!下面會詳細介紹:html

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

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

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

 

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

 

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

    參考代碼:日誌

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

 

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

    參考代碼:htm

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

  固然也可使用多層嵌套。blog

  效果以下:get

  

 

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

相關文章
相關標籤/搜索