之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查,还真是,主要是区别在堆栈信息的起始点不同。

总结如下:

我们都知道,C#中使用throw和throw ex抛出异常,但二者是有区别的。

在C#中推荐使用throw;来抛出异常;throw ex;会将到现在为止的所有信息清空,认为你catch到的异常已经被处理了,只不过处理过程中又抛出新的异常,从而找不到真正的错误源。

throw的用法主要有以下几种:

第一种(不推荐使用,可惜很多人都一直这么用的,包括俺,嘻嘻),这样适用会吃掉原始异常点,重置堆栈中的异常起始点:

try
{
}
catch (Exception ex)
{throw ex;
}

第二种,可追溯到原始异常点,不过编译器会警告,定义的ex未有使用:

try
{
}
catch (Exception ex)
{throw;
}

第三种,不带异常参数的,这个同第二种其实一样,可捕获所有类型的异常,IDE不会告警:

try
{
}
catch
{throw;
}

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

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

try
{
}
catch (Exception ex)
{throw new Exception("经过进一步包装的异常", ex);
}

下面用个例子来加以说明:

class Program
{/// <summary>/// 入口方法/// </summary>public static void Main(){ExceptionClass ec = new ExceptionClass();try{ec.ExceptionThrow1();}catch (Exception ex){Console.WriteLine(ex.ToString());}Console.WriteLine("---------------------------------------------------------------------");try{ec.ExceptionThrow2();}catch (Exception ex){Console.WriteLine(ex.ToString());}Console.WriteLine("---------------------------------------------------------------------");try{ec.ExceptionThrow3();}catch (Exception ex){Console.WriteLine(ex.ToString());}Console.WriteLine("---------------------------------------------------------------------");try{ec.ExceptionThrow4();}catch (Exception ex){Console.WriteLine(ex.ToString());}Console.WriteLine("---------------------------------------------------------------------");Console.ReadKey();}
}/// <summary>
/// 该Class用来测试异常抛出时相关上下文栈的调用情况
/// </summary>
public class ExceptionClass
{/// <summary>/// 抛出异常方法/// </summary>public void ExceptionThrow1(){try{// 调用原始异常抛出方法来抛出异常this.ExceptionMethod();}catch (Exception ex){throw ex;}}/// <summary>/// 抛出异常方法1/// </summary>public void ExceptionThrow2(){try{this.ExceptionMethod();}catch (Exception ex){throw;}}/// <summary>/// 抛出异常方法2/// </summary>public void ExceptionThrow3(){try{this.ExceptionMethod();}catch{throw;}}/// <summary>/// 抛出异常方法3/// </summary>public void ExceptionThrow4(){try{this.ExceptionMethod();}catch (Exception ex){throw new Exception("经过进一步包装的异常", ex);}}/// <summary>/// 原始异常抛出方法/// </summary>private void ExceptionMethod(){throw new DivideByZeroException();}
}

运行结果如下:

从运行的结果可以看到,第一种用法已经吃掉了原始异常信息。而其它3种用法都可以追溯到原始异常,推荐使用第四种用法,希望大家能了解这些细微的差别,享受Coding的乐趣吧。

原文:http://www.cnblogs.com/JerryTian/archive/2012/09/24/2699459.html

C#使用throw和throw ex的区别相关推荐

  1. throw和throw ex的区别

    之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查,还真是,主要是区别在堆栈信息的起始点不同 ...

  2. “throw”和“throw ex”之间有区别吗?

    有些帖子询问这两者之间的区别是什么. (为什么我还要提这个...) 但我的问题是不同的,我称之为"抛出ex"在另一个错误的神像处理方法. public class Program ...

  3. throw;与throw ex;之间的区别

    很多时候,大家当用到向上抛出异常的时候,常常是throw;和throw ex;随便用,从来都没有留意它们之间的区别.今天我才知道,它们之间是有区别的.原文出自:http://mattgollob.bl ...

  4. throw语句以及throw “error“ 和 throw new Error(“error“)的区别

    文章目录 什么是 throw 语句? throw 语句后面跟一个对象 Error 构造函数对象 结论 什么是 throw 语句? throw 语句用来抛出一个用户自定义的异常.当前函数的执行将被停止( ...

  5. Difference: throw or throw ex?

    Difference: throw or throw ex? 主要区别在于throw出的堆栈详细程度. throw ex只是抛出在当前代码处的错误. throw 能够更进一步,抛出内部调用的具体错误. ...

  6. java中int和integer的区别_Java异常中throw和throws关键字的区别

    Java中常常弄混的两个关键字,throw和throws,它们有什么区别呢?如何记忆他们,而不至于出错呢? throw和throws 区别 throws:出现在方法的签名中,声明当前方法可能抛出的所有 ...

  7. java中的throw_Java中的throw和throws之间的区别

    throw和throws都是异常处理的概念,其中throw用于显式地从方法或任何代码块中引发异常,而throw在方法的签名中用于指示此方法可能抛出列出的类型之一例外. 以下是throw和throws之 ...

  8. java方法后面throw的作用_Java异常处理中throw与throws的用法区别

    前言 说到异常,我们当然会想到try catch finally.当然如果用这个的话,被try块包围的代码说明这段代码可能会发生异常,一旦发生异常,异常便会被catch捕获到,然后需要在catch块中 ...

  9. Java 中 throw 和 throws 联系与区别

            throws 用于方法后声明抛出异常,而 throw 关键字用来人工引发异常,异常发生时,系统会生成一个异常对象,并将其抛出,但也可通过throw语句显式抛出. 相同:throw显式抛 ...

最新文章

  1. java B2B2C Springcloud多租户电子商城系统-(七)高可用的分布式配置中心(Spring Cloud Config)...
  2. Microsoft Teams快速上手系列-08Teams中的内部防火墙
  3. Kaggle常用函数总结 原创 2017年07月03日 21:47:34 标签: kaggle 493 kaggle比赛也参加了好几次,在这里就把自己在做比赛中用到的函数汇总到这,方便自己以后查阅
  4. 二分图最大权匹配 KM算法
  5. Traffic Simulator Applet(交通模拟器小程序)
  6. 10---Net基础加强
  7. JDK 下载相关资料
  8. 老男孩python课后作业_老男孩python基础知识练习题(一)中
  9. 以下模块打印出超级块中某些字段的内容
  10. 僵尸 AI 来了,人类该怎么办?
  11. SHELL中变量字串中包含$时怎么办?
  12. 记一次守护日志导致硬盘空间告警问题
  13. c语言编程void什么意思,c语言中void啥意思?
  14. 什么是数字孪生技术?
  15. 比 Elasticsearch 更快 RediSearch + RedisJSON = 王炸
  16. 电脑技巧:Win7、Win10、Win11如何选择,看完你就懂了
  17. http协议、URL、GET/POST请求报文及响应报文
  18. 阿里巴巴Canal原理剖析
  19. 【Comet OJ - 2019国庆欢乐赛 F】 高速公路
  20. 影视剪辑,自学剪辑的8大技巧

热门文章

  1. 利用tabluea分析数据的案例_tableau数据可视化案例
  2. 测试时代新推出《测试员》特刊之软件测试基础
  3. Kaggle神器LightGBM最全解读(附代码说明)!
  4. 橘络有活血的功效,泡水喝可有效预防血管硬化、血管破裂、脑溢血
  5. 【无标题】OSPF协议及ACL的使用及配置
  6. 复习一下,? extends T 和 ? super T
  7. opencv曝光过度_软件开发|使用 OpenCV 进行高动态范围(HDR)成像
  8. 重新学习ava(三) ---- 面向对象之继承!
  9. 有关傅里叶变换及其反变换的问题
  10. 随笔 - 《为什么你在淘宝搜索的东西,会出现在抖音广告里?》-20201210