首页 | 互联网 | IT动态 | 网络设备 | 服务器 | IDC | 安全 | Cisco | Windows | Linux | Java | .Net | Oracle | CIW | 华为 | 专题
IT技术 | 网页设计 | 平面设计 | 电子书下载 | 教学视频 | 方案 | 数字网校 | 直播室 | 虚拟考场 | 面授培训 | 搜索 | 博客 | 沙龙 | 论坛
首页 | JAVA | C# | VB | VB.NET | C/C++ | delphi | 工程管理 | 其他语言 | 论坛
免费注册一站通帐号,参与直播、论坛、下载、博客、网摘、评论,展现我的风采!
您现在的位置: 中国IT实验室 >> 桌面开发 >> C# >> 文章正文
使用C++异常来取代exit()函数
来源:天极开发  时间:2007-6-22

  从C语言开始接触C++的人,恐怕都知道exit()这个函数,似乎现在很多的程序员都有这样一种习惯,在程序一遇到错误、或任务刚完成时,把调用exit()函数当成是一种最好的结束程序的方法。在以前遗留的许多老式C/C++代码中,这种现象非常普遍,但当手头的软件项目逐步进展并越来越大时,就不得不面临合并以前分散的各个模块这项工作,此时,如果还有人记得起软件日志记录、错误宽容度、或至少适当的清理工作,就已经是万幸了。本文中要说的方法,决不是一条设计准则,但是可减轻修正那些未良好设计及实现的老式代码时所带来的痛苦。

  用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;
}

 

[1] [2] 下一页  

【责编:Youping】

中国IT教育热线咨询

相关文章
基于Delphi的异常处理技术探究
编程软件系列之C++编程技巧
在Visual C#中定义和使用自己的特性
C++中确定基类有虚析构函数
如何使用Delphi实现无边界窗体的移动
C语言中的位域的使用
如何在C++中动态分配二维数组
Java程序开发中代理技术的使用方法
推荐文章
· 用C#创建COM对象
· IT管理十大失误及其对策
· VC中利用MFC设计绘图程序初步
· JAVA中对象创建和初始化过程
· C语言中的位域的使用
· 浅谈Java桌面应用程序开发
· C#的前途如何?
· 几种VC++数据库开发技术的相对比较
 精彩友情推荐
·锐捷交换机报价
·锐捷交换机
·锐捷网络网络交换机
·smc交换机
·smc交换机报价
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
最新更新 推荐文章
·Visual Basic 9.0隐式类型的局部…09-30
·JMX+J2SE5.0实现Web应用的安全管…09-30
·多线程、Socket技术及委托技术的…09-21
·Visual C#多线程参数传递浅析09-21
·浅谈Java中利用JCOM实现仿Excel编…09-21
·基于Java的界面布局DSL的设计与实…09-21
·Java开发中的事件驱动模型实例详…09-21
·并发工程原则应用到软件项目中09-06
·Delphi初学者应小心的六大陷阱09-06
·VC开发多语言界面支持的简单方法09-06
·用C#创建COM对象09-06
·用C#创建COM对象09-06
·IT管理十大失误及其对策08-30
·VC中利用MFC设计绘图程序初步08-23
·JAVA中对象创建和初始化过程08-23
·C语言中的位域的使用08-09
·浅谈Java桌面应用程序开发08-09
·C#的前途如何?08-02
·几种VC++数据库开发技术的相对比较07-12
·用Visual C#实现网络封包监视07-12
·VB.NET中的TextBox控件详解07-12
·VB.NET实现PC与掌上电脑PPC的双向通信07-05
  培训中心