之前,在使用异常捕获语句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. EIGRP Metric计算
  2. PART 5: INTEGRATING SPRING SECURITY WITH SPRING BOOT WEB
  3. JavaScript eval() 函数的用法
  4. 防火墙简介(二)——firewalld防火墙
  5. dockerfile构建nginx并结合php
  6. 土压力图怎么画_电气系统图怎么画?
  7. 多路复用IO和异步IO
  8. [react-router] React-Router 4怎样在路由变化时重新渲染同一个组件?
  9. GroupID和ArtifactID
  10. Spring+Quartz(一)
  11. 计算机名代表电脑什么,电脑开机蓝屏的各种文件名是什么意思
  12. npm报错,安装不上依赖,npm代理报错
  13. 【转】Canny 算法
  14. Unix操作系统基础:Unix文件系统之文件权限
  15. 项目UML设计(团队)
  16. 今日头条信息流 - 橙子建站
  17. php网页加入音乐和歌词,怎么给视频加歌词,给mv加歌词,视频加歌词字幕
  18. 胡水生:中小型企业如何应对互联网的发展
  19. un-app部署h5项目到普通云服务器--域名解析--OOS对象存储
  20. Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码

热门文章

  1. Windows程序入口
  2. WINDOWS键盘事件监控原理及应用 (转)
  3. Qt自定义控件之仪表盘的完整实现
  4. http缓存机制详解之--强缓存
  5. 视频素材剪辑制作的方法分享
  6. Android Hawk的源码解析,一款基于SharedPreferences的存储框架
  7. 大焕视界:乡愁是一道深不可测的陷阱
  8. postgresql 安装 配置远程访问 PostgreSQL WAL日志解析工具: wal2json cdc数据同步方案
  9. MATLAB画聚类热图,使用ComplexHeatmap简单绘制热图
  10. python热图_python – 使用matplotlib中的3D数据生成热图