抛出异常的区别 throw 和throw ex

  在面试的过程中提到了异常捕获的的几种用法,之前一直使用但是没有仔细留意,调试程序的过程中发现还是有区别的,主要区别在堆栈信息的起始点不同,下边我们通过实例来看这集中不同的抛出异常的方法。

  一般我们推荐throw来抛出异常,使用throw ex来抛出异常会清空存储的异常信息,认为已经处理过异常,只不过在抛出的过程中又产生的新的异常信息,从而找不到真正的错误源。

  第一种 使用的人数最多,但是不推荐使用,这样处理异常程序会清空堆栈中的异常信息,在堆栈中重置异常点。

1             try
2             {
3             }
4             catch (Exception ex)
5             {              
6                 throw ex;
7             }        

  第二种 这种会追溯到异常的起源点,但是程序会报 定义的ex未被使用的警告

1             try
2             {
3             }
4             catch (Exception ex)
5             {
6                 throw;
7             }

  第三种 这中方式和第二种相同 可以捕获所有的异常,IDE也不会警告

1             try
2             {
3             }
4             catch
5             {
6                 throw;
7             }

  第四种 对异常重新包装,但同时保留了异常的起源点。  

1         try
2             {
3             }
4             catch (Exception ex)
5             {
6                 throw new Exception("经过进一步包装的异常", ex);
7             }

  下边我们看具体使用过成中各种抛出异常的使用方法,对各种方法就会有了清晰的认识

  1 using System;
  2 
  3 namespace Throw
  4 {
  5 class Program
  6     {
  7         static void Main(string[] args)
  8         {
  9             ExceptionClass ec = new ExceptionClass();
 10 
 11             try
 12             {
 13                 ec.ExceptionThrow1();
 14             }
 15             catch (Exception ex)
 16             {
 17 
 18                 Console.WriteLine(ex.ToString());
 19             }
 20             Console.WriteLine("----------------------华丽的分割线---------------------------");
 21             try
 22             {
 23                 ec.ExceptionThrow2();
 24             }
 25             catch (Exception ex)
 26             {
 27 
 28                 Console.WriteLine(ex.ToString());
 29             }
 30             Console.WriteLine("----------------------华丽的分割线---------------------------");
 31             try
 32             {
 33                 ec.ExceptionThrow3();
 34             }
 35             catch (Exception ex)
 36             {
 37 
 38                 Console.WriteLine(ex.ToString());
 39             }
 40             Console.WriteLine("----------------------华丽的分割线---------------------------");
 41             try
 42             {
 43                 ec.ExceptionThrow4();
 44             }
 45             catch (Exception ex)
 46             {
 47 
 48                 Console.WriteLine(ex.ToString());
 49             }
 50             Console.WriteLine("----------------------华丽的分割线---------------------------");
 51 
 52             Console.ReadKey();
 53         }
 54     }
 55 
 56     /// <summary>
 57     /// 测试上下文抛出异常 相关上下文 栈的调用情况
 58     /// </summary>
 59     public class ExceptionClass
 60     {
 61 
 62         private void ExceptionMethod()
 63         {
 64             throw new DivideByZeroException();
 65         }
 66 
 67         /// <summary>
 68         /// 抛出异常的方法
 69         /// </summary>
 70         public void ExceptionThrow1()
 71         {
 72             try
 73             {
 74                 this.ExceptionMethod();
 75             }
 76             catch (Exception ex)
 77             {              
 78                 throw ex;
 79             }
 80         }
 81 
 82         public void ExceptionThrow2()
 83         {
 84             try
 85             {
 86                 this.ExceptionMethod();
 87             }
 88             catch (Exception ex)
 89             {
 90                 
 91                 throw;
 92             }
 93         }
 94 
 95         public void ExceptionThrow3()
 96         {
 97             try
 98             {
 99                 this.ExceptionMethod();
100             }
101             catch (Exception)
102             {
103 
104                 throw;
105             }
106         }
107 
108         public void ExceptionThrow4()
109         {
110             try
111             {
112                 this.ExceptionMethod();
113             }
114             catch (Exception ex)
115             {
116 
117                 throw new Exception("经过进一步包装的异常",ex);
118             }
119         }
120     }
121 }

程序运行结果

原文地址:https://www.cnblogs.com/a164266729/p/4913898.html