前言,最近遇到一个使用try-catch异常捕获后记录一下日志,然后再抛出该异常后,异常堆栈里无法显示准确的堆栈地址的问题?   其实以前也遇到过类似问题,没有重视,这次好好研究了下,并上度娘上找了找其他道友的文章一起看了,发现处理方式的不同的确会有影响!下面会详细介绍:

  推荐使用:原始异常抛出写法(throw;),重点1!我们主要看初始的异常堆栈及错误信息,捕获异常的位置,一般会记录一些请求数据等。

  我常用的使用try-catch捕获异常重新抛出的代码方式:

 try{
//代码块
}catch(Exception ex){
//日志处理
this.Logger.LogDebug(ex, $"记录异常");
throw ex;
}

这用方式乍一看感觉没啥问题,我将异常做了日志处理后,直接又抛出去了,但是最终的异常堆栈里只显示了是在第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方式抛出异常有何不同

C#中try catch中throw ex和throw方式抛出异常有何不同_异常捕获堆栈丢失问题的更多相关文章

  1. C#中try catch中throw ex和throw方式抛出异常有何不同

    我们在C#的try catch代码块中里面经常使用throw语句抛出捕捉到的异常,但是你知道吗使用throw ex和throw抛出捕获到的异常效果是不一样的. 异常捕捉的原理 首先先介绍一下C#异常捕 ...

  2. C++中Try Catch中的继承

    1.C++中Try Catch简介:我们编译运行程序出错的时候,编译器就会抛出异常.抛出异常要比终止程序灵活许多. 而C++异常是指在程序运行时发生的反常行为,这些行为超出了函数正常功能的范围.当程序 ...

  3. C++中try&catch

    参考:   https://blog.csdn.net/xueluowutong/article/details/81257654 在c++中,可以直接抛出异常之后自己进行捕捉处理,如:(这样就可以在 ...

  4. T-SQL编程中的异常处理-异常捕获(catch)与抛出异常(throw)

    本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出,本文简单介绍异常捕获与异 ...

  5. T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw)

    本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出(try catch th ...

  6. c++中try catch的用法

    c++中try catch的用法 标签: c++exception数据库sqlc 2011-10-24 21:49 45622人阅读 评论(3) 收藏 举报  分类: 一点小结(267)  版权声明: ...

  7. C#:在catch中return,会执行finally吗?

    本文转自 vipxiaotian(CSDN) 请参考下面一段简单的语句块: 1:  try2:  {3:      throw new Exception("new exception&qu ...

  8. C#中try catch finally的执行顺序

    1.首先明确一点,就是不管怎样,finally一定会执行,即使程序有异常,并且在catch中thorw 了 ,finally还是会被执行. 2.当try和catch中有return时,finally仍 ...

  9. javascript中 try catch用法

    javascript中 try catch用法 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-08-16我要评论 JS try catch语句一般在什么情况下使用?是必须使 ...

随机推荐

  1. NSURLSession的用法

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //[self getTest]; ...

  2. .NET Core简单使用RabbitMq

    RabbitMQ简介 RabbitMQ是一个开源的,基于AMQP(Advanced Message Queuing Protocol)协议的完整的可复用的企业级消息队,RabbitMQ可以实现点对点, ...

  3. NSDateFormatter格式详细列表一览

    转自:http://www.cnblogs.com/xinus/archive/2012/10/29/NSDateFormatter_samples.html 前言:iOS开发中NSDateForma ...

  4. HTML <input> placeholder 属性

    css ::-webkit-input-placeholder { /* WebKit, Blink, Edge */ color: #909; } :-moz-placeholder { /* Mo ...

  5. axios报错: Cannot read property 'protocol' of undefined ....

    错误: Uncaught (in promise) TypeError: **Cannot read property 'protocol' of undefined ... 源码: 完整错误: im ...

  6. (全国多校重现赛一)A-Big Binary Tree

    You are given a complete binary tree with n nodes. The root node is numbered 1, and node x's father ...

  7. JSP+Servlet 实现:理财产品信息管理系统

    一.接业务,作分析 1.大致业务要求 1.1 使用 JSP+Servlet 实现理财产品信息管理系统,MySQL5.5 作为后台数据库,实现查看理财 和增加理财功能 1.2 查询页面效果图 1.3 添 ...

  8. ARTS-S EN0001-In tech race with China, US universities may lose a vital edge

    原文 The U.S. is still out in front of global rivals when it comes to innovation, but American univers ...

  9. ajax来获取JWT的token

    AJAX方式获取token需要用

  10. IoTClient开发5 - ModBusRtu协议

    前言 前面我们介绍了ModBusTcp协议.今天我们接着来介绍ModBusRtu协议.和ModBusTcp不同的是ModBusRtu基于串口通信,ModBusTcp是基于Tcp以太网通信. 所以我们在 ...