zoukankan      html  css  js  c++  java
  • 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处理是一样的。

        参考代码:

    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#代码
    属性面板:tabcontroller
    窗体效果
    c#窗体开发
    帝国cms学习
    在树莓派上运行 .net core 2.1 程序 并实现开机启动
    C# 高性能的数组 高性能数组队列实战 HslCommunication的SharpList类详解
    C# 序列化详解,xml序列化,json序列化对比
    C# 读写redis C#读写实时数据库
    python 读写三菱PLC数据,使用以太网读写Q系列,L系列,Fx系列的PLC数据
  • 原文地址:https://www.cnblogs.com/lxhbky/p/11848292.html
Copyright © 2011-2022 走看看