随笔-69  评论-645  文章-19  trackbacks-13

几乎大多数C#程序员都这样写异常处理代码的

代码一:
1try
2{ThrowException();}
3catch(Exception ex)
4{throw ex;}
5finally
6{}

如果你的底层代码还有一个方法用来抛出异常
代码二:
1public ThrowException()
2{
3throw new Exception("一个底层异常");
4}
那么,你也许需要将这个底层的异常重新抛出

如果你使用代码一的方式,将会打断异常的堆栈跟踪,在VS2005中的表现是新抛出了一个异常(代码一中的ex),而不是抛出底层异常(代码二中的new Exception("一个底层异常");)

那么怎么才能不打断异常的堆栈跟踪并能重抛底层异常呢,可以这样写。
代码三:
1try
2{
3ThrowException();
4}

5catch
6{
7throw;
8}
这样就能重新抛出代码二中的底层异常。
当然你可以包装一下底层异常。代码如下:
代码四:
try
{
 ThrowException();
}

catch(Exception ex)
{
 
throw new Exception("被包装后的底层异常",ex);
}
这样不会打断异常堆栈跟踪。
我的理解比较浅,多多指正。

参考资料:http://www.cnblogs.com/1landonsea/archive/2005/01/15/RethrowExceptionInCSharp.html
posted on 2007-03-15 00:16 Kai.Ma 阅读(2469) 评论(17)  编辑 收藏 所属分类: 开发环境

评论:
#1楼  2007-03-15 09:01 | 非我      
能举详细点的例子吗,这样实在看不出来有什么太大的差异
  回复  引用  查看    
#2楼  2007-03-15 09:18 | Cat Chen      
throw ex是会隐藏深层堆栈的,所以最好不要使用。

throw new Exception(ex)可以保持深层堆栈,但是改变了异常的类型,除非你确信你的组件的使用者不关注原本那个异常的类型,否则也不要用。

throw;这是建议用法,如果你所需要的仅仅是异常的继续上升。
  回复  引用  查看    
#3楼  2007-03-15 10:01 | henry      
有时.net运行时抛出的Exception并不是最终异常的根源,可以通过InnerException 属性得到引发该Exception的源Exception.
  回复  引用  查看    
#4楼  2007-03-15 10:03 | YanziMyWife      
以前都没有关注过这个问题 谢谢LZ共享
  回复  引用  查看    
#6楼  2007-03-15 10:51 | reonlyrun      
还是AVOID "throw e" !!! 比较清楚

  回复  引用  查看    
#7楼  2007-03-15 12:28 | JesseZhao      
呵呵
  回复  引用  查看    
#8楼  2007-03-15 13:21 | Cat Chen      

  回复  引用  查看    
#9楼 [楼主] 2007-03-15 14:15 | 马哥      
看来讨论出真知。谢谢skyfei和Cat Chen的指点。
  回复  引用  查看    
#10楼  2007-03-15 14:37 | Anders Cui      
如果较低层次的异常在较高层次的运行环境中没有什么意义,可以考虑对较低层次抛出的异常进行适当的封装,在对异常进行封装时将其指定为内部异常(inner exception)。看看我刚写的:)

http://www.cnblogs.com/anderslly/archive/2007/03/15/understandingexception2.html

  回复  引用  查看    
#11楼  2007-03-15 20:40 | Cat Chen      
@Anders Cui
谢谢,看Framework Design Guideline时看过那些规则了。
  回复  引用  查看    
#12楼  2007-03-15 22:09 | Anders Cui      
@Cat Chen
汗...
  回复  引用  查看    
#13楼  2007-03-15 22:24 | 讨厌 [未注册用户]
最讨厌代码左边加行号
  回复  引用    
#14楼 [楼主] 2007-03-15 22:28 | 马哥      
@讨厌
为什么呢?
  回复  引用  查看    
#15楼  2007-03-16 13:04 | Anders Cui      
@马哥
拷到编辑器里,行号也算作文本了 :)
  回复  引用  查看    
#16楼 [楼主] 2007-03-16 13:19 | 马哥      
@Anders Cui
明白了,以后写blog我一定改
  回复  引用  查看    
#17楼  2007-03-19 15:48 | 阿牛      
同意,要是用 throw ,可以在出错时,定位到出错行。要是用 throw ex;完蛋了。找起错误来,怎一个费劲了得
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-19 22:19 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: