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处理是一样的。 参考代码: { 代码块 1 }(Exception ex1){ 日志处理 ); ; } ? 划重点2-嵌套异常抛出:? 将第5行的异常捕获改为:?使用new Exception("test new error message",ex);? ? ?通过new一个新的异常,将ex放入内部异常参数中即可保留原始异常信息。 ? ?参考代码: { 代码块1 }(Exception ex){ 日志处理 ); throw new Exception(test error,ex) } 当然也可以使用多层嵌套。 效果如下: ? 参考道友文章:C#中try catch中throw ex和throw方式抛出异常有何不同 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 关于asp.net中的配置文件和会话
- asp.net – 如何使用JwtSecurityTokenHandler和JWKS端点验证
- asp.net – ContentPlaceHolder可以放在Web用户控件中吗?
- asp.net – 添加GridTemplateColumn会破坏RadGrid
- asp.net-core – 如何在.NET Core 2.0中使用PrincipalConte
- asp.net – 创建希腊数据
- asp.net-mvc-3 – ASP.NET MVC3 – Html.TextBoxFor和autof
- asp.net – 如何使用PowerShell了解IIS中托管的特定网站的活
- asp.net-mvc – 用于ninject的ASP.NET MVC 3 Preview配置
- asp.net-mvc-4 – mvc4捆绑强类型捆绑包