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