您的位置:首页 > 其它

异常重抛的几种方法总结

2008-04-01 16:32 197 查看
这两者的主要不同在于输出的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)可以加上自定异常信息。方便判断错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: