使用C++异常来取代exit()函数[1]
从C语言开始接触C++的人恐怕都知道exit()函数。似乎现在很多程序员都有一个习惯,就是在遇到错误或者任务刚刚完成的时候,调用exit()函数作为结束程序的新方法。这种现象在很多过去遗留下来的老C/C++代码中非常普遍。然而,当手头的软件项目逐渐进展,变得越来越大时,就不得不面临将以前分散的模块合并的任务。这个时候,如果谁还记得软件的日志记录,容错,或者至少适当的清理,那就是幸运的。本文将要描述的方法绝不是设计标准,但它可以减轻修复设计和实现不佳的旧代码所带来的痛苦。
用回归代替退出,无疑是解决这个问题最明显的办法。如果软件项目非常简单,这也是一个有效的解决方案。但是,在一个项目中,往往有几十个函数分布在多个源文件中,这些函数的调用嵌套在很深的层次中,所以事情就变得棘手了。在这种情况下,如果所有的函数都返回void,仍然可以修改它们以返回一个退出代码,但是代价很大。如果函数已经可以返回一个有意义的值,但是遇到错误时只调用exit(),那么这项工作就会变得更加耗时,也更加容易出错。这里用exit()离题也是可取的。当旧代码没有被设计为返回任何东西的时候,如果你想得到返回代码,你就不得不依靠exit()。
这个问题还是有解决办法的。在这种情况下,我们假设所有的源代码都是C++格式,或者不需要全部编译就可以移植到C++格式,用throw替换所有出现exit的地方(这可以自动完成,甚至不需要了解旧代码是如何工作的);然后,在任何适当的地方捕捉整数形式的异常代码。该方法还可以根据严重程度或恢复程度处理不同级别的错误。
请看下面的例子,原始代码如下:
//main . CPP
void main(){
/initialize
...
ProcessMail(...);
}
//另一个源文件
void进程邮件(...){
/初始化
...
if(initialization error){
printf("初始化失败!!!\ n ");
exit(-1);
}
while(!关机){
阅读邮件(...)
/继续处理
...
}
}
作废已读邮件(...)
{
...
//对ReadBytes()的调用出现在函数的许多地方,包括循环中。
nBytesAvailable = read bytes(...)
...
}
//另一个源文件
int read bytes(...)
{
/读取数据
...
if (error) {
printf("出现错误!!\ n ");
exit(-1);
}
return nbytes read;
}
0条评论