Exception Handling

Exception handling说难不难,但是关于exception的问题分歧较多,没有定论,所以要处理好exceptions需要相当的耐心和较全面的考虑。

下面的几条rules或许有一定的指导意义:

1、  If you can’t actuallyhandle the exception, don’t. 但是,怎样才能称为“can handle”呢?这个问题的答案会不会是因人而异,或者是存在一个比较客观的标准呢?对于一个具体的error,不同人很可能有不同的观点(大部分情况下是截然相反的)。

2、  Don’t swallow exceptions. 这就要求我们弄明白每一个exception的来源,影响等问题,从而决定是否处理以及如何处理。

3、  Exception的一个好处就是一旦发生,程序是不可忽略它的。这个好处是针对传统错误报告方式返回error code而言的。尽管这不是一个本质上的优点,但是考虑到千千万万、各种各样developers的实际水平等因素,这个特点可能就具有重大意义。

4、  是不是exception应该用在exceptional的情况?Use exceptions only inexceptional cases,这是一个普遍被认可的观点(尽管对exceptional cases还有很多争论),所以,exception和return code很久以来一直共生共存。但在.NET环境下,exception已经被作为一种通用的error报告和处理方式了,似乎有意要消除return code。难道return code这种传统的error报告方式已经或将要过时了?

5、  不要定义一个custom exception type,而仅仅只是给这个新的exceptiontype一个有意义的名字。Exception的主要作用是指示有某种error的发生,而具体是什么性质和类型的error不是exception本身所必须准确记录的。一个exception只要能大致区分error种类,以便caller能区分不同情况采取不同措施即可。Caller采取的具体措施不是依赖于exception提供的信息,而是依赖于具体的callee所实现的功能。在debug环境下,exception的最有意义的信息(stack trace)与exception的type信息是无关的。

6、  Eric Lippert(C# team member @MSFT)在一篇blog post(http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx)里根据exception的起因(causes)对exception进行分类,并据此进行不同的处理(handling)。虽然Eric对exception的分类有一定的随意性(fatal,boneheaded, vexing and exogenous),但是他的对exception的处理(handling)方式有很大的借鉴意义,而且Eirc提出和要解决的问题恰恰是exception handling问题中最让人迷惑、难以准确把握的地方。Eric的思想遵循了exception handling的一般原则,即If you can’t actuallyhandle the exception, don’t. 但同时又包含了诸多其他的原则或经验。

7、  Anders Hejlsberg(C# lead @MSFT)在一篇interview中(http://www.artima.com/intv/handcuffsP.html)提出了一个值得注意的问题:从某种意义上来看,exception的意义更重要的在于当一个exception发生进行stack unwinding时,允许程序在每一个stackframe处进行clean up(C#中的try-finally提供的能力);而不在于对这个exception如何进行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值