2012年1月11日星期三

慎用C++异常

慎用C++异常
  --慎用try-throw-catch结构(C++代码)





# 背景描述
“The disadvantage of the __try{}__catch(Expression){} construction is that you may forget to guard a potentially incorrect code that may cause an exception that won't be handled by your program”

先分析上面这句说明吧,引用于这里

该句引发讨论,思考,回忆,整理……最后导致写了篇该Blog。
具体原因与情况无解:)

# 示例剖析 
开始先举个简单示例吧,如下:
try
{
...
}
catch(int e1)
{


     if (1 ==e1)
          ...
     else  if (2 ==e1)
     ...
}
catch(char e2)
{


     if ('1' ==e2)
          ...
     else  if ('2' ==e2)
     ...
}

但当try语句块里面抛出异常,为以下情况之一:
1.  (3==e),捕获到异常,但无设计对应异常处理操作;
2. 或('3'==e),捕获到异常,同样无处理 ;
3. 或throw "error" (e为char*类型没做catch捕获处理),无法捕获。

若出现该情况,亦可以算是代码分析与设计的不足,对于错误情况认知不够。
所以,选择下面的做法:
1. 要么就一概不用try-throw-catch结构处理异常情况;
2. 要么保证可以捕获并处理所有异常,但强烈不推荐catch(...)这样的捕获(虽然可捕获所有异常)!

当然,对于所有的异常情况做到完全的认知,很多情况都是很难的。So大多数的工程性代码鉴于安全可靠性,均不推荐或禁止代码使用try-throw-catch结构。


# 建议分享
还有一点值得说明,try-throw-catch结构的实现机制,在不同的操作系统都会有区别,同时不同系统对于该结构的支持程度也不一样。在程序的运行效率方面也是有影响的,当然比起纯粹的函数返回错误码再根据错误码处理异常的机制相差一些的(更多的详情细节找谷歌求解吧)。

针对异常情况,其他处理方案取代 :
step1. 返回错误码 .
step2. 根据不同错误码再做不同处理 .

btw.
 异常会降低程序效率 ,当程序需要编译器做优化时 ,会因为过多使用异常 ,而失效 .
 尽量少用使用异常 ,异常开销可能会比较大 ,而且不同编译器对于支持异常 ,其实现的效率也不一样 .

OK,总结至此。欢迎交流。

/个人总结 /junkun huang /2012-01-11/


(完)

没有评论:

发表评论