之前,在使用异常捕获语句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);
}

最新文章

  1. bzoj1723--前缀和(水题)
  2. 清空IE缓存
  3. java多线程系类:JUC原子类:02之AtomicLog原子类
  4. Struts2 框架下 session 读出来为null
  5. 蓝桥杯 入门训练 Fibonacci数列(水题,斐波那契数列)
  6. 初始化lpc2106开发工程
  7. CGCS2000 VS WGS84
  8. HDU5934 Bomb(2016杭州CCPC第二题)(强连通缩点)
  9. FreeSWITCH在呼叫失败的情况下播放语音提示
  10. Properties读取资源文件的四种方法
  11. anything vs everything
  12. 提示ORA-03113:通信通道的文件结尾解决
  13. Windows 7/8 自带定时关机命令
  14. Django Sqlite3 数据库向MySQL迁移
  15. 包含深度学习常用框架的Docker环境
  16. ORACLE行转列(行转1列,行转多列)
  17. JavaSE复习日记 : 抽象类
  18. Unity3D游戏开发之小地图的实现
  19. ASP.NET Identity 身份验证和基于角色的授权
  20. web实现数据交互的几种常见方式

热门文章

  1. Ubuntu 14.04.2 x64 安装tomcat服务器傻瓜教程
  2. 给WordPress Page页面添加摘要输入框
  3. 响应式js幻灯片代码一枚
  4. Highways(prim & MST)
  5. Ubuntu 开机自启动工具 update-rd.d 使用详解
  6. Mysql函数集合
  7. digitalocean添加ssh_keys
  8. 使用virtualenv搭建独立的Python环境
  9. C++公有继承
  10. 73 [面试题]交换一个整数的二进制表示的奇偶位(swapOddEvenBits)