2007年5月18日星期五

[转] 异常处理的讨论

对C++异常处理机制的讨论
今天在C++技术大会上做了一个Presentation,论题是C++的异常处理机制。很有点出乎我的意料,大家的反馈很是强烈。演讲后,午饭中,以及下午的讨论板块,很多人争相发表自己的看法。

姑且不谈争论的细节,我想一定程度的争论不是坏事情。不同的观点更有助于我们认识问题,和让更多的人意识到问题的存在。

1,争议的一个地方是无法接受我引用的几个对C++异常处理机制的反对性意见(例如不要在自己的代码中主动抛出异常)。对于此,我主要是从软件工程的角度考虑而支持这些意见的,因为一种技术如果在工程应用中不易被大多数人所把握,那么我们就应该考虑是否还要应用它。因为应用一种技术的目的是为了降低软件项目的复杂度,而不是相反。这一点我在开篇就强调了。但也许有些听者晚到了,没有听到。

2,引起争论的另一个地方是有听者觉得我主要谈的是结构化异常处理(SEH),不是C++的异常处理机制。事实上,因为我讨论的是针对Windows操作系统和MS Visual C++编译器。因此,EH是基于SEH之上实现的。EH只是简单的做些包装就把C++的异常转变为SEH统一处理了。也正是因为这个原因,在Windows下,C++异常捕捉块(VC编译器)也可以捕捉到CPU定义的除0等异常。

尽管有不同意见,很多人还是很有同感的赞同我提出的结论。

模块内和内部模块之间不要用抛出异常代替错误返回;
设置全局性的异常预处理和未处理异常补救措施(类似Windows XP引入的向量化异常处理机制, VEH);
定义完善的错误处理政策和机制
错误日志
错误代码格式

没有评论: