使用C 异常来取代exit()函数
2008-02-23 05:32:50来源:互联网 阅读 ()
用return来取代exit,无疑是解决此问题最显而易见的方法,假如软件项目很简单,这也是最高效的解决方案;然而,项目中经常有成打的函数分布在多个源文档中,且这些函数的调用也嵌套在很深的层次中,那么,事情就变得棘手了。假如在这种情况中,任何的函数都返回void,还是有可能修改他们,让其返回一个退出码(exit code)的,但所付出的代价也很大;假如函数已能返回一个有意义的值,只是在碰到错误时,调用了exit(),那么这项工作会变得更消耗时间,也会更加容易出错。这里说点题外话,使用exit()也是有可取之处的,当老式代码没有设计返回任何东西时,假如想得到返回码(return code),只有靠exit()了。
有关此问题,还是有一个解决方法的,在这种情况下,我们假定任何的源代码已为C 格式,或无需全部编译就能够移植为C 格式,把任何exit出现的地方全部换成throw(这能够自动完成,甚至无须理解老代码是怎样工作的);接着,在任何适当的地方,捕获为整数的异常码,这种方法还可依据严重性或恢复程度的不同,在不同层面上处理错误。
请看以下示例,原始代码如下:
// main.cpp void main() { //初始化 ... ProcessMail(...); } //另一个源文档 void ProcessMail(...) { //初始化 ... if ( initializationError ) { printf("faild to init!!!\n"); exit(-1); } while ( !shutdown ) { ReadMail(...) //继续处理 ... } } void ReadMail(...) { ... //对ReadBytes()的调用出现在函数内的多处地方,包括在循环中。 nBytesAvailable = ReadBytes(...) ... } //另一个源文档 int ReadBytes(...) { //读取数据 ... if ( error ) { printf("there was an error!!\n"); exit(-1); } return nBytesRead; } |
void main() { //初始化 ... try { ProcessMail(...); } catch (int ret) { switch (ret) { case E_INITIALIZATION_FAILURE: ... case E_IRRECOVERABLE: ... ... } } } void ProcessMail(...) { //初始化 ... if ( initializationError ) { throw(E_INITIALIZATION_FAILURE); } while ( !shutdown ) { try { ReadMail(...) } catch (int ret) { switch (ret) { case E_READ_ERROR: //记录错误信息 ... //试图恢复 ... if ( recovered ) { continue; } else { throw(E_IRRECOVERABLE); } break; case ... } } //继续处理 ... } //throw()能够用来取代缺少的返回码 //但也要注意由此带来的性能损失 throw(S_OK); } // ProcessMail() void ReadMail(...) { ... //在此无须捕获异常 nBytesAvailable = ReadBytes(...) ... } int ReadBytes(...) { //读取数据 if ( error ) { throw(E_READ_ERROR); } return nBytesRead; } |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 并非偏见 也驳“驳'C语言已死了'”
下一篇: C 中使用BHO来屏蔽特定网站
- 使用C 异常来取代exit()函数[2] 2008-02-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash