异常重抛的几种方法总结

这两者的主要不同在于输出的stack trace上:

  • 如果你直接使用throw;,那么stack trace就和根本不存在这个catch块的时候一样,显示错误根源是真正抛出异常的地方。
  • 如果你使用throw ex;,那么stack trace就认为你catch到的异常已经被处理了,只不过处理过程中又抛出新的异常,这时候stack trace就把throw ex;当作错误根源了。

 显然,后者会让stack trace的信息量少了,增加了追踪错误来源的难度,所以最好不要这样做。如果你要进行catch,然后你又要让异常继续冒泡,除了throw ex;以外你还有另外一个选择:
try
{
  MethodThatThrowsException();
}
catch (Exception ex)
{
  throw new Exception("oops!", ex);
}

这时候,你就将原本的异常封装进了新抛出的异常中,而stack trace会自动认为内部异常是导致当前异常的原因,也就会把内部异常的stack trace也递归显示出来。

有些人常用的方式是
try
{
  MethodThatThrowsException();
}
catch (Exception ex)
{
  throw new Exception("一个未知异常之类的话");
}
如果这样处理就等于把错误屏蔽掉了,这样上层无法得知此处发生了什么异常,所以异常的得理最好按照上面的两种方法
一种是直接重抛。另一种是进行封装。

今天又以实际的代码测试了
1.throw;
2.throw ex;
3.throw new Exception("");
4.throw new Exception("",ex);

这四种异常重抛。。。总结如下(在.net 1.1环境下)
只有throw new Exception("",ex)可以直接定位到发生异常错误代码的地方,其它的无法定位到,只能定位到异常抛出的地方。
throw new Exception("")完全吞掉异常。只显实Exception中的信息。。
throw和throw ex完全一样,没有区别,都是可以正常显示异常信息,但是不定们到异常发生的代码,只定到抛出异常这里。

所以throw,throw ex,throw new Exception("",ex)三种基本没有问题,在写类库这类代码,不要使用throw new Exception("")这样的方式,他会完全吞掉异常,上层调用代码完全不知道发生什么异常。
其它三种方式使用个人认为差别不在。不过throw new Exception("",ex)可以加上自定异常信息。方便判断错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值