C#使用throw和throw ex的区别
之前,在使用异常捕获语句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的区别相关推荐
- throw和throw ex的区别
之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查,还真是,主要是区别在堆栈信息的起始点不同 ...
- “throw”和“throw ex”之间有区别吗?
有些帖子询问这两者之间的区别是什么. (为什么我还要提这个...) 但我的问题是不同的,我称之为"抛出ex"在另一个错误的神像处理方法. public class Program ...
- throw;与throw ex;之间的区别
很多时候,大家当用到向上抛出异常的时候,常常是throw;和throw ex;随便用,从来都没有留意它们之间的区别.今天我才知道,它们之间是有区别的.原文出自:http://mattgollob.bl ...
- throw语句以及throw “error“ 和 throw new Error(“error“)的区别
文章目录 什么是 throw 语句? throw 语句后面跟一个对象 Error 构造函数对象 结论 什么是 throw 语句? throw 语句用来抛出一个用户自定义的异常.当前函数的执行将被停止( ...
- Difference: throw or throw ex?
Difference: throw or throw ex? 主要区别在于throw出的堆栈详细程度. throw ex只是抛出在当前代码处的错误. throw 能够更进一步,抛出内部调用的具体错误. ...
- java中int和integer的区别_Java异常中throw和throws关键字的区别
Java中常常弄混的两个关键字,throw和throws,它们有什么区别呢?如何记忆他们,而不至于出错呢? throw和throws 区别 throws:出现在方法的签名中,声明当前方法可能抛出的所有 ...
- java中的throw_Java中的throw和throws之间的区别
throw和throws都是异常处理的概念,其中throw用于显式地从方法或任何代码块中引发异常,而throw在方法的签名中用于指示此方法可能抛出列出的类型之一例外. 以下是throw和throws之 ...
- java方法后面throw的作用_Java异常处理中throw与throws的用法区别
前言 说到异常,我们当然会想到try catch finally.当然如果用这个的话,被try块包围的代码说明这段代码可能会发生异常,一旦发生异常,异常便会被catch捕获到,然后需要在catch块中 ...
- Java 中 throw 和 throws 联系与区别
throws 用于方法后声明抛出异常,而 throw 关键字用来人工引发异常,异常发生时,系统会生成一个异常对象,并将其抛出,但也可通过throw语句显式抛出. 相同:throw显式抛 ...
最新文章
- java B2B2C Springcloud多租户电子商城系统-(七)高可用的分布式配置中心(Spring Cloud Config)...
- Microsoft Teams快速上手系列-08Teams中的内部防火墙
- Kaggle常用函数总结 原创 2017年07月03日 21:47:34 标签: kaggle 493 kaggle比赛也参加了好几次,在这里就把自己在做比赛中用到的函数汇总到这,方便自己以后查阅
- 二分图最大权匹配 KM算法
- Traffic Simulator Applet(交通模拟器小程序)
- 10---Net基础加强
- JDK 下载相关资料
- 老男孩python课后作业_老男孩python基础知识练习题(一)中
- 以下模块打印出超级块中某些字段的内容
- 僵尸 AI 来了,人类该怎么办?
- SHELL中变量字串中包含$时怎么办?
- 记一次守护日志导致硬盘空间告警问题
- c语言编程void什么意思,c语言中void啥意思?
- 什么是数字孪生技术?
- 比 Elasticsearch 更快 RediSearch + RedisJSON = 王炸
- 电脑技巧:Win7、Win10、Win11如何选择,看完你就懂了
- http协议、URL、GET/POST请求报文及响应报文
- 阿里巴巴Canal原理剖析
- 【Comet OJ - 2019国庆欢乐赛 F】 高速公路
- 影视剪辑,自学剪辑的8大技巧
热门文章
- 利用tabluea分析数据的案例_tableau数据可视化案例
- 测试时代新推出《测试员》特刊之软件测试基础
- Kaggle神器LightGBM最全解读(附代码说明)!
- 橘络有活血的功效,泡水喝可有效预防血管硬化、血管破裂、脑溢血
- 【无标题】OSPF协议及ACL的使用及配置
- 复习一下,? extends T 和 ? super T
- opencv曝光过度_软件开发|使用 OpenCV 进行高动态范围(HDR)成像
- 重新学习ava(三) ---- 面向对象之继承!
- 有关傅里叶变换及其反变换的问题
- 随笔 - 《为什么你在淘宝搜索的东西,会出现在抖音广告里?》-20201210