欢迎来到图者知识网!

江苏省计算机二级讲义,计算机等级考试二级

教育考试 时间:2019-12-05

【www.tuzhexing.com--教育考试】

12.3.1 使用异常实例

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

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

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

on Exception do

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

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

try

{整数运算}

except

on ERangeError do

{越界处理}

on EIntError do

{其它整数异常处理}

end;

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

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

下面的代码同时使用了异常响应和异常保护。异常响应用于设置变量的值,异常保护用于释放资源。当异常响应结束时利用raise重引发一个当前异常。

var

APointer: Pointer ;

AInt , ADiv: Integer;

begin

ADiv := 0;

GetMem ( APointer , 1024 );

try

try

AInt := 10 div ADiv ;

except

on EDivByZero do

begin

AInt := 0 ;

raise;

end;

end;

finally

FreeMem ( APointer , 1024 );

end;

end;

上面一段代码体 体现了异常处理的嵌套。异常保护、异常响应可以单独嵌套也可以如上例所示的那样相互嵌套。

本文来源:http://www.tuzhexing.com/jiaoyu/988932/

推荐内容