掌握C++ builder的除错艺术(1)
howto (若你不喜欢e文的话,我会尽快翻译)。记住这个想法,我会在以后另一个步骤详细说明)。要让它再有力一些的话,标准委员会决定包括如下的声明catch(…) ,没错括号中就是三个点。此声明允许我们捕捉任何异常,我的意思是所有的异常。还想再有力一些?当然可以,你可以用附加的catch( )声明,跟if..else if…的样子差不多。这里要牢牢记住!如果你捕捉到了一个异常类型,那么以后就它不会被再次捕捉到了!所以先看下面的代码…
你可以看到,这里按照 "是edbengineerror吗? 是->处理,不是?->继续捕捉" "是eexternalerror吗? 是-> 处理, 不是?-> 继续下一次捕捉" 等等… 这样的顺序排列。 接着还有更多的内容。如果你希望对某个异常做些什么,又不希望异常就此消失,你可以重新抛出(产生)这个异常。它将继续向后寻找新的catch()过程来处理它。我不能说我经常这么做。但最好应该知道,就象“抛出”一样简单。就是这样,throw将带着已经被你处理过的异常继向后寻找另一个catch来处理它。 最后而不是最不重要的 (这部分不包括在标准规范中,倒更象是borland专有的增加版)就是 __finally 声明,使用一个 __finally{ } 模块,你可以指定不管有否异常产生都将运行的代码。这里是清除你通过new方法分配的局部变量及将所有应该设定回正常状态的标志复位(例如将一个等待状态的鼠标指针复位成正常状态)的最方便的地方。 呸,太多了!休息一下吧,有空可以看一看c++builder帮助中的exception类, (所有e开头的,你会注意到它们都是从exception类继承来的。这也是定制你自己的异常类的好练习!) 当你回来时,我们将进入下一步旅程。 使用记录(logging)机制 您不可能总是使用除错器来除虫,有时你没法依靠内建除错器的力量,所以有时你将不得不求助于其他的除错手段来调试程序。(典型例子如:nt服务、isapi/cgi程序、实时应用程序…等等)此时您将不得不求助于我们这样经验丰富的程序员才会谈到的老式的除错/调试技术。例如产生使用某种记录(logging)机制来看看程序的头巾下面到底发生了什么的念头。幸运的是,有许许多多的现成的机制可以让我们的这项工作变得容易些。这里我将谈到我所偏爱的三种方法,你也可以将您自己的方法email给我,我会考虑加入这一部分。 okay 先说第一种,(调试/除错输出字串)outputdebugstring。幸运的是microsoft已经为我们实现了一个非常广泛的调试/除错子系统。包括实现您自己的调试/除错记录系统的机制。程序在一个调试/除错进程内运行的时候,outputdebugstring将它的参数(一个c string)输出到调试/除错器的输出上下文,若调试/除错器没有运行,outputdebugstring就被忽略。如果没有弹出消息的时候,outputdebugstring在终端上也可以很好的运行,当你分发给客户前别忘了移去它(通过 #ifdef debug…#endif’),程序可以运行的更快一点。“wow,又好又容易!”你也许会说“但当程序不能在调试/除错器内运行时,该怎么办?” 请牢记,这只是我的观点,基于一种观念的评价,我个人使用gexperts的dbugint.pas界面来调试/除错。这是个非常优秀的独立的小程序。如果愿意,您可以将它分发给你的客户们。如果没有这么做,象outputdebugstring一样,如果没有安装,它实际上就什么也不做:)(它 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |