throw和throw ex的区别

C#中使用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             }

其实第二种和第三种用法,书上也是不建议使用的,一般要从小粒度的异常捕获开始,采用多个catch语句

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

第四种:经过对异常重新包装,但是会保留原始异常点信息。推荐使用。

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

例如:

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

throw和throw ex的区别的相关文章

throw和throws子句的区别

import java.io.IOException public class ThrowDemo{ public static void processFile(String toFile) throws IOException { //Omitted implementation propagates all //throw  IOException back to the caller } public static void main(String[] args){ for(String

C#中使用throw和throw ex抛出异常的区别

通常,我们使用try/catch/finally语句块来捕获异常,就像在这里说的.在抛出异常的时候,使用throw和throw ex有什么区别呢? 假设,按如下的方式调用几个方法: →在Main方法中调用Method1方法,try/catch捕获异常→在Method1方法中调用Method2方法,try/catch捕获异常→在Method2方法中故意抛出异常,try/catch捕获异常 使用throw抛出异常 static void Main(string[] args) { try { Met

c# throw和throw ex

原文:c# throw和throw ex c# throw和throw ex 我们在日常开发当中,经常会用到exception异常,并且我们会在exception中的catch块中throw exception,例如: static void M3() { try { //你的业务代码 } catch (Exception ex) { throw ex; } } 但是大家是否清楚在catch块中 throw和throw ex的区别呢?在一次电话面试中,面试官就问到这个问题了,当时没有答上来, 事

throw和throw是区别

throw和throws的区别 相同:都是用于做异常的抛出处理的. 不同点: 使用的位置: throws 使用在函数上,throw使用在函数内 后面接受的内容的个数不同: throws 后跟的是异常类,可以跟多个,用逗号隔开. throw 后跟异常对象.

异常机制及throw与throws的区别

Java的异常处理: Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally.Java的在线帮     助中对这几个关键字是这样解释的: Throws: Lists the exceptions a method could throw. Throws:列出一个方法可抛出的异常.       Throw: Transfers control of the method to the exception handler. Throw:将方法的控制权

[Erlang37]error/1 exit/1 exit/2 throw/1的区别

1. error/1 主要是系统用来定义内部错误的: Erlang内建的run time error 一共有10种: function_clause/case_clause/if_clause/badmatch/badarg/undef/badarith/badfun/badarity/system_limit, 比如: 1> erlang:binary_to_list(1). ** exception error: bad argument in function binary_to_list

throw和throws的区别和联系

突然发现今天诗兴大发,看来又得写点内容了. throw和throws对于Java程序员而言它们真的不是很陌生.但对于我这样的选手而言一提到它们的区别和联系就蒙圈了... 为了以后不蒙圈,今天就研究一下吧~~ 如果有不足的地方欢迎批评指正... 1)throws 对于throws关键字而言一般用于抛出编译时的异常,如果某个异常是编译是异常,那么这个异常就需要捕获(try{}catch{}finally{}) 或者抛出(throws).否者的话是无法通过编译的. 这里再简单讲讲二者的区别 对于try

throw跟throws关键字

定义一个方法的时候可以使用throws关键字声明.使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理. throws关键字格式: public 返回值类型 方法名称(参数列表,,,)throws 异常类{}: 假设定义一个除法,对于除法操作可能出现异常,可能不会.所以对于这种方法最好将它使用throws关键字声明,一旦出现异常, 则应该交给调用处处理. class Math{ public int div(int i,int j) throws Exception{

C# 异常处理(Catch Throw)IL分析

1.catch throw的几种形式及性能影响: private void Form1_Click(object sender, EventArgs e) { try { } catch { throw; } } private void Form1_Load(object sender, EventArgs e) { try { } catch (Exception) { throw; } } private void Form1_Enter(object sender, EventArgs