用户 密码
太平洋系列网站:太平洋汽车网 | 太平洋游戏网
首  页 | 数码世界 | 手机通讯 | 硬件资讯 | 软件资讯 | 招聘与培训 | 游戏天下 | 下载中心 科技动态 | 今日报价 | 渠道商情 | 产品大全 | 笔 记 本 | 教你买电脑 | 评 测 室 | 短信中心
论  坛 | 影音家电 | 摄影专区 | 玩家E族 | 竞技天地 | Flash 动漫 | 有奖活动 |

-
您现在的位置:软件资讯 > 开发特区 > 开发语言 > C++Builder
掌握C++Builder的除错艺术:第一篇 正确书写代码

出处:中国软件
责任编辑:pjl

[04-2-14 9:29] 作者:史平洋
第一篇 正确书写代码

1. 简介

2. 书写干净的代码

3. 使用异常及异常处理能力

4. 使用记录(logging)机制

5. 结合使用记录机制与类的异常处理机制

6. 处理您代码外产生的异常

7. 你的回合

8. 版权说明

1. 简介
这篇文章,我将从最基本的开始谈起。但希望可以涉及更广的层面,而不仅仅是为你的程序除错(debug)。你将会看到,我认为除错(debugging)这个字的全部意义,并不只是通过IDE的内建机制来运行的。我希望在这篇小小的文章结束时,几乎每个读者都可以学到至少是一件新东西,并把它藏到你的兵器库中。记住,你程序中的错误(BUG)越少,你的最终用户对你的程序的感觉就越好;你对错误(BUG)的处理越好,用户们发现错误(BUG)时就越乐于告诉你以便你改正错误。好了,现在系好安全带,戴上护目镜,让我们开始一段疯狂的路程!

2. 书写干净的代码

首先而且也许是最重要的一点是书写干净、可读的代码是极其重要的。能够在写完一段代码后回顾一下并给它加上注释来说明这段代码用来做什么和为什么这么做,将会省去你以后跟踪代码的无数个痛苦的小时。也许你会多花一点时间来书写,但当你花过N小时来跟踪那些难以捉摸的BUG时,你就会同意多花点时间来让程序代码可读是多么值得了。(你本可以很容易完成除错的)。如果没有这么做过,我建议你停下来,读读另一篇Scott的精彩文章-代码的风格(大家需要的话,将会尽快翻译)。

3. 使用异常及异常处理能力
现在进入下一步,这仍然是基于代码的步骤。(除了在极少数的情况下,你不能老是使用系统内建的除错器,所以知道其他可以找出这些麻烦的虫子的办法总是个好主意)。本步骤完全是关于如何做到,更重要的是处理好在你的窗体出现异常时系统扔给你的(产生的)错误。在C++标准得到认可前黑暗的旧日子里,应用程序通常会通过返回值来发出错误信号(这种方法在OLE和一些WINAPI函数中仍在使用)。很显然,你可以很轻易的忽略这些(事实上也是经常的,我的意思是你经常检查一个WINAPI函数的返回值吗?)。

所以他们决定….,okay,我们需要一个新的机制,一个你不能忽略的。但你可以处理,定制(自定义 customize)。异常就此出现了。想要一个特殊的错误类型标志?容易的很,定义一个新的异常类型(不过是一个类,没别的),抛出来(产生这个异常)。完了。

例子:

class MyException

{ public:

AnsiString iMessage;

MyException(AnsiString Message) { iMessage=Message;}

};

throw new MyException(“Test Exception Message”);

就这么简单!(当然不是很完全,我会很快加上的)。漂亮而又简单,并且非常容易定制来满足您的需要。Okey,你会问到:“我能产生异常了,但如何处理它们?我的意思是,我想在第一时间(位置)从我的代码中排除异常!”这当然很容易做到,实际上还很容易定制呢!标准委员会为我们定义了try {/* code */} catch (...) {/* code */ }机制,跟异常机制一样,它完全可以定制来满足您的需要!只需把您的执行代码段放在try模块中就行了,您还需要一个catch( ) 或 __finally 模块来告诉程序(如果)得到一个异常的时候作什么。现在就是你这么做的好处,你定义了一个类class类型并且输入变量来捕捉异常-通过声明catch( )。(在前面的例子中,应该是这样-catch(MyException &E) { /*在这里书写捕捉到异常后的处理代码*/})为了让这个系统更有力,你可以建立完整的子类继承树。这样当你捕捉基类时你可以捕捉所有从这个基类继承的异常类型(VCL中一个很好的例子就是所有的异常都是从Exception类继承而来的,所以catch(Exception& E) 将捕捉所有的VCL异常,当然包也括您所产生的。但EsocketError除外,见xiphias在http://www.bytamin-c.com/ 的howto (若你不喜欢E文的话,我会尽快翻译)。记住这个想法,我会在以后另一个步骤详细说明)。要让它再有力一些的话,标准委员会决定包括如下的声明catch(…) ,没错括号中就是三个点。此声明允许我们捕捉任何异常,我的意思是所有的异常。还想再有力一些?当然可以,你可以用附加的catch( )声明,跟if..else if…的样子差不多。这里要牢牢记住!如果你捕捉到了一个异常类型,那么以后就它不会被再次捕捉到了!所以先看下面的代码…

Try

{

// 程序的正常运行代码

}

catch(EDBEngineError &E)

{

// 处理基于数据库引擎的错误

}

catch(EExternalError &E)

{

//通常处理基于windows的错误

}

catch(Exception &E)

{

// 处理所有其他的VCL错误

}

你可以看到,这里按照 "是EDBEngineError吗? 是->处理,不是?->继续捕捉" "是EexternalError吗? 是-> 处理, 不是?-> 继续下一次捕捉" 等等… 这样的顺序排列。

接着还有更多的内容。如果你希望对某个异常做些什么,又不希望异常就此消失,你可以重新抛出(产生)这个异常。它将继续向后寻找新的catch()过程来处理它。我不能说我经常这么做。但最好应该知道,就象“抛出”一样简单。就是这样,throw将带着已经被你处理过的异常继向后寻找另一个catch来处理它。

最后而不是最不重要的 (这部分不包括在标准规范中,倒更象是Borland专有的增加版)就是 __finally 声明,使用一个 __finally{ } 模块,你可以指定不管有否异常产生都将运行的代码。这里是清除你通过new方法分配的局部变量及将所有应该设定回正常状态的标志复位(例如将一个等待状态的鼠标指针复位成正常状态)的最方便的地方。

呸,太多了!休息一下吧,有空可以看一看C++Builder帮助中的Exception类, (所有E开头的,你会注意到它们都是从Exception类继承来的。这也是定制你自己的异常类的好练习!) 当你回来时,我们将进入下一步旅程。


发给好友 投稿给我们 加入收藏 返回顶部

相关文章:
IT培训十大热门文章

内容搜索 
高级搜索
本栏今日焦点