[转载]有效提高C++ Builder程序质量(一)

原著:英雄

程序的bugs越少,程序的评价越高。我们介绍一些调试程序时“应该做”或“不应该做”的原则。写易读的代码:大概也是最重要的一点,就是写干净易读的代码。

  使用Exceptions和Exception的处理方法:开发人员不可能总是依靠于集成的调试工具。所以,学会用其它的方法来找到烦人的bugs是很重要的。一些重要的、处理的错误可能会在窗体之外发生。在C++标准制定出来之前的黑暗日子里,在程序里面发出发生错误的信号,通常是通过返回错误代码完成的(现在这种方法仍然应用于OLE技术和一些Winapi函数),这样的处理方法很容易就会被忽略。(比如说,你经常检查winapi函数的返回值吗?)所以,出现问题的可能性并不小。由于以上的原因,我们需要一个这样的机制,它能让我们不能忽略这些错误,而且,这个机制应该能被我们控制和自定义的。在这样的需求下,异常处理机制出现了。需要一个特殊的错误类型吗?简单,定义一个新的异常类型就行了(和定义一个类的方法差不多),然后抛出(throw)它。

下面这个例子说明了这一过程。
  例1:
  //----------------------------------------------------------------  
  class MyException  
  {  
  public:  
  AnsiString iMessage;  
  MyException(AnsiString Message) { iMessage=Message;}  
  };  
  throw new MyException(“Test Exception Message”);  
  //---------------------------------------------------------------  
  这个程序简单高效,而且便于自定义。你也许会问:“我可以使抛出异常了,但是,怎么控制它们呢?”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()语句将不会捕捉这条错误。

例2:
  //----------------------    
  try  
  {  
   // 正常代码  
  }  
  catch(EDBEngineError &E)  
  {  
   // 处理数据库引擎错误  
  }  
  catch(EExternalError &E)  
  {  
   // 处理窗口类的错误  
  }  
  catch(Exception &E)  
  {  
   // 处理所有的VCL错误
  }  
  //----------------------  
  例2的代码运行流程是这样的:“错误是EDBEngineError吗?是->处理它。不是->运行下一个catch语句”“错误是EExternalError吗?是-〉处理它。不是-〉运行下一个catch语句”等等。

  这个机制还有更多的功能。如果你想处理异常,但是不想在处理的位置停止,那么可以重新抛出异常。这时,程序将继续寻找下一个catch()语句来处理这个异常。这个方法和“throw”差不多。这样,你处理过的异常会再次被抛出,继续寻找下一个catch语句来处理它。

  最后一个要说的是__finally(这不是标准的用法,是Borland添加的一个好方法),在__finally{}程序块中代码,无论是否发生异常都会被执行。这是一个清理程序中使用new分配的本地变量,设置用作旗标的变量值为正常的好位置。

  就是这些了。有时间的话,请看看C++Builder帮助文件中的Exception类以及继承Exception的类。这些将对于理解本节所说的内容有很大帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值