异常处理与程序调试(二)

2016-01-29 14:06 8 1 收藏

异常处理与程序调试(二),异常处理与程序调试(二)

【 tulaoshi.com - Delphi 】

 

12.3 异常响应 

  异常响应为开发者提供了一个按自己的需要进行异常处理的机制。try …except …end形成了一个异常响应保护块。与finally不同的是:正常情况下except 后面的语句并不被执行,而当异常发生时程序自动跳到except,进入异常响应处理模块。当异常被响应后异常类自动清除。

  下面的例子表示了文件打开、删除过程中发生异常时的处理情况: 

uses Dialogs;

var

F: Textfile;

begin

OpenDialog1.Title := 'Delete File';

if OpenDialog1.Execute then

begin

AssignFile(F, OpenDialog1.FileName);

try

Reset(F);

if MessageDlg('Erase ' +OpenDialog1.FileName + '?',

mtConfirmation, [mbYes, mbNo], 0) = mrYes then

begin

System.CloseFile(F);

Erase(F);

end;

except

on EInOutError do

MessageDlg('File I/O error.', mtError, [mbOk], 0);

on EAccessDenied do

MessageDlg('File access denied.', mtError, [mbOk], 0);

end;

end;

end.

  保留字ondo用于判断异常类型。必须注意的是:except后面的语句必须包含在某一个ondo模块中,而不能单独存在。这又是同finally不同的一个地方。 

12.3.1 使用异常实例 

  上面所使用的异常响应方法可总结为如下的形式: 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/delphi/)

  on ExceptionType do

{响应某一类的异常} 

  这种方法唯一使用的信息是异常的类型。一般情况下这已能满足我们的需要。但我们却无法获取异常实例中包含的信息,比如异常消息、错误代码等。假设我们需要对它们进行处理,那么就必须使用异常实例。

  为了使用异常实例,需要为特定响应模块提供一个临时变量来保存它: 

  on EInstance : ExceptionType do  … 

  在当前响应模块中我们可以象使用一个普通对象那样来引用它的数据成员。但在当前响应模块之外不被承认。

  下面的代码用于获取异常消息并按自己的方式显示它: 

{窗口中包括一个ScrollBar部件,一个Button部件} 

procedure TErrorForm.Button1Click(Sender: TObject);

begin

try

ScrollBar1.Max := ScrollBar1.Min-1;

except

on E: EInvalidOperation do

MessageDlg('Ignoring Exception:'+E.Message,

mtInformation,[mbOK],0);

end;

end; 

12.3.2 提供缺省响应 

  在异常响应模块中,一般我们只对希望响应的特定异常进行处理。如果一个异常发生而响应模块并没有包含对它的处理代码,则退出当前响应模块,异常类仍被保留。

  为了保证任何异常发生后都能在当前响应模块中被清除,可以定义缺省响应: 

try

{ 程序正常功能}

except

on ESomething do

{响应特定异常}

else

{提供缺省响应}

end; 

由于else可以响应任何异常,包括我们一无所知的异常,因此在缺省响应中最好只包括诸如显示一个消息框之类的处理,而不要改变程序的运行状态或数据。 

12.3.3 响应一族异常 

  诸如

    on ExceptionType do

的异常响应语句不仅可响应本类异常,而且可以响应子类异常。对于象EIntErrorEMathError等系统不会引发的异常,它们将只响应其子类异常。而对于象

   on Exception do

这样的语句将会对任何异常进行响应。

  下面一段代码对整数越界异常进行单独处理,而对其它整数异常进行统一处理: 

  try

{整数运算}

except

on ERangeError do

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/delphi/)

{越界处理}

on EIntError do

{其它整数异常处理}

end;  

由于异常在处理后即被清除,因而上面的代码可保证不会使ERangeError异常被多次处理。假如颠倒两条响应语句的顺序,则ERangeError异常响应将永远没有被执行的机会。 

  由于异常在处理后即被清除,因而当希望对异常进行多次处理时就需要使用保留字raise来重引发一个当前异常。

来源:http://www.tulaoshi.com/n/20160129/1492544.html

延伸阅读
本文给出了类型化和非类型化XML列各自的优势、将SQL Server 2000数据库迁移到SQL Server2005,新的异常处理如何工作;如果表的架构发生更改,我如何执行操作等,供大家参考! SQL Server 2005 包括对Transact-SQL (T-SQL) 语言的几项重要改进。新增功能之一是一种新的触发器,它在数据定义语言 (DDL) 语句运行时激发。在跟踪或保护数...
标签: PHP
调试程序是一个漫长的过程,程序越长越复杂,调试起来就愈加困难。如果你调试的是php程序,那么不妨采用phpUnit,它可以大大加快你的调试速度。 何谓PhpUnit Phpunit 脱胎于Fred Yankowski编写的著名的Junit测试框架。你可以到它的网站 http://www.ontosys.com/phiki/phpunit 下载最新的版本。你可以利用phpUnit编写一套...
五十七、只针对异常情况才使用异常:       不知道你否则遇见过下面的代码: 代码如下:      try {               int i = 0;3        while (true)       ...
16.1、简介: 异常是程序执行时遇到的任何错误情况或意外行为。 以下这些情况都可以引发异常:您的代码或调用的代码(如共享库)中有错误,操作系统资源不可用,公共语言运行库遇到意外情况(如无法验证代码),等等 《Exception Handling for C++》关于异常处理论文, 向对象中每增加一个类,都可能包含一些错误。 ...
标签: 电脑入门
显卡硬件安装完成只相当于显卡的安装工作完成了一半,驱动程序的安装与设置就是显卡安装的另一半。只有安装完成显卡的驱动程序,显卡的显示核心的所有功能才会启动,显卡才会提供给我们绚丽的画面。 在学习显卡驱动设置之前,我们先来回答两个常见问题: 问:为什么桌面显示正常,但就是不能玩游戏? 答:在Windows中其实会自带一些显卡的驱...