前言,最近遇到一個使用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