最近遇到一個使用try-catch異常捕獲後記錄一下日誌,然後再拋出該異常後,異常堆棧里無法顯示準確的堆棧地址的問題? 其實以前也遇到過類似問題,沒有重視,這次好好研究了下,並上度娘上找了找其他道友的文章一起看了,發現處理方式的不同的確會有影響!下麵會詳細介紹: 推薦使用:原始異常拋出寫法... ...
前言,最近遇到一個使用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方式拋出異常有何不同