📄 20010329001.htm
字号:
<HTML>
<HEAD>
<TITLE>掌握C++Builder的调试艺术</TITLE>
<META content="MSHTML 5.00.2314.1000" name=GENERATOR>
</HEAD>
<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0
vLink=#990099>
<div align="center">
<table width="744" border="0" cellspacing="0" cellpadding="0" height="76">
<tr>
<td>
<p align="center"><span class=name00><b><font size="3"><br>
掌握C++Builder的调试艺术</font></b><br>
</span><span
class=content>以代码为基础的调试方法<br>
</span><span class=Name01><font
color=#666666>(作者:霍炬编译)</font></span></p>
<p> <br>
<span
class=content> 程序的bugs越少,最终用户对这个程序的评价越高。而开发人员事先对bugs的处理越多,最终用户能提供的关于bugs的信息就越多,也越准确,这样,开发人员在接到最终用户反映之后,就能够快速找到出现bugs的那部分代码,并以最快速度发布程序的升级包。
<br>
<br>
在这份教程中,我们从最基本的部分开始,逐步介绍许多在调试程序时“应该做”或“不应该做”的原则。正如你将看到的,这份教程中所指的“调试”这个词所包含的意思很多,而不只是如大部分人所想到的--利用IDE集成的调试器的“调试”。我希望读过这份教程之后,读者可以在思路上有所收获。
<br>
<br>
<strong>写易读的代码</strong> <br>
第一点,大概也是最重要的一点,就是写干净易读的代码。易读的代码是很有价值的。请想象一下,如果随便扫视一眼代码或注释,就能立刻知道这段代码的的作用,以及在写代码的时候为什么要这样写,当时的思路是什么,那么就可以节约大量时间。这样的代码,在写的时候可能会稍稍慢一些,不过,当你调试程序时,就不会花上几个小时来寻找bugs,相反,你可以快速,简单的完成除错工作。这时,你就会觉得多花一些时间使程序易读是很值得的。
<br>
<br>
所以,我推荐你在写程序的时候,应该养成自己的风格,或是读一读Scott的关于代码风格的文章。 <br>
<br>
<strong>使用Exceptions和Exception的处理方法</strong> <br>
我们教程的下一步,仍然是以代码为基础的。因为除去一些少数的情况,开发人员不可能总是依靠于集成的调试工具。所以,学会用其它的方法来找到烦人的bugs是很重要的。一些重要的、处理的错误可能会在窗体之外发生。在C++标准制定出来之前的黑暗日子里,在程序里面发出发生错误的信号,通常是通过返回错误代码完成的(现在这种方法仍然应用于OLE技术和一些Winapi函数),这样的处理方法很容易就会被忽略。(比如说,你经常检查winapi函数的返回值吗?)所以,出现问题的可能性并不小。由于以上的原因,我们需要一个这样的机制,它能让我们不能忽略这些错误,而且,这个机制应该能被我们控制和自定义的。在这样的需求下,异常处理机制出现了。需要一个特殊的错误类型吗?简单,定义一个新的异常类型就行了(和定义一个类的方法差不多),然后抛出(throw)它。下面这个例子说明了这一过程。
<br>
<br>
例1: <br>
<br>
//----------------------------------------------------------------
<br>
<br>
class MyException <br>
<br>
{ <br>
<br>
public: <br>
<br>
AnsiString iMessage; <br>
<br>
MyException(AnsiString Message) { iMessage=Message;} <br>
<br>
}; <br>
<br>
throw new MyException(“Test Exception Message”); <br>
<br>
//---------------------------------------------------------------
<br>
<br>
就是它!(不是十分好,下面我们会继续完善它)。简单高效,而且便于自定义。也许你现在会问:“我可以使抛出异常了,但是,怎么控制它们呢?我的意思是,我想在代码的最前面排除异常。”C++Builder为我们中定义了try
{} catch (...) {}机制。这和我们刚刚定义的异常机制的结构很相似。这个机制完全可以按照需要自定义。要使用异常处理了,只要把要执行的代码放到try块里面,为了让程序知道出现异常后应该做什么,还需要定义一个catch()或是__finally块。catch()语句里面可以指定一个要捕捉的类型或是变量(比如例1,就是catch(MyException
&E){ /* 异常处理代码/}这个机制很强大,甚至可以用它来捕捉树结构或是继承类的异常,如果捕捉了基类的异常,它就能捕捉到继承这个基类的所有的类的异常。比如,在VCL中,所有的异常都是继承于Exception类。所以,catch(Exception&
E)可以捕捉到除了EsocketError的所有VCL异常。(这点请特别注意,以后还将继续讨论。)为了让这个机制更强大,C++Builder中还定义了catch(…)语句。(没错,就是三个点)使用这条语句可以捕捉到所有的异常。还有更多的功能吗?当然,你可以添加更多的catch()语句,可以向使用if...else
if...语句那样使用它。注意,在一系列的catch()语句中,错误不会被重复的捕捉,也就是说,如果前面的catch()语句捕捉到了错误,后面的catch()语句将不会捕捉这条错误。
<br>
<br>
例2: <br>
<br>
//---------------------- <br>
<br>
try <br>
<br>
{ <br>
<br>
// 正常代码 <br>
<br>
} <br>
<br>
catch(EDBEngineError &E) <br>
<br>
{ <br>
<br>
// 处理数据库引擎错误 <br>
<br>
} <br>
<br>
catch(EExternalError &E) <br>
<br>
{ <br>
<br>
// 处理窗口类的错误 <br>
<br>
} <br>
<br>
catch(Exception &E) <br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -