下面的代码同时使用了异常响应和异常保护异常响应用于设置变量的值异常保护用于释放资源当异常响应结束时利用raise重引发一个当前异常
var
APointer: Pointer ;
AInt ADiv: Integer;
begin
ADiv := ;
GetMem ( APointer )
try
try
AInt := div ADiv ;
except
on EDivByZero do
begin
AInt := ;
raise;
end;
end;
finally
FreeMem ( APointer )
end;
end;
上面一段代码体现了异常处理的嵌套异常保护异常响应可以单独嵌套也可以如上例所示的那样相互嵌套
自定义异常类的应用
利用Delphi的异常类机制我们可以定义自己的异常类来处理程序执行中的异常情况同标准异常不同的是这种异常情况并不是相对于系统的正常运行而是应用程序的预设定状态比如输入一个非法的口令输入数据值超出设定范围计算结果偏离预计值等等
使用自定义异常需要
自己定义一个异常对象类
自己引发一个异常
定义异常对象类
异常是对象所以定义一类新的异常同定义一个新的对象类型并无太大区别由于缺省异常处理只处理从Exception或Exception子类继承的对象因而自定义异常类应该作为Exception或其它标准异常类的子类这样假如在一个模块中引发了一个新定义的异常而这个模块并没有包含对应的异常响应则缺省异常处理机制将响应该异常显示一个包含异常类名称和错误信息的消息框
下面是一个异常类的定义
type
EMyException = Class(Exception) ;
自引发异常
引发一个异常调用保留字raise后边跟一个异常类的实例
假如定义
type
EPasswordInvalid = Class(Exception)
则在程序中如下的语句将引发一个EPasswordInvalid异常
If Password <> CorrectPassword then
raise EPasswordInvalidCreate(Incorrect Password entered)
异常产生时把System库单元中定义的变量ErrorAddr的值置为应用程序产生异常处的地址在你的异常处理过程中可以引用ErrorAddr的值
在自己引发一个异常时同样可以为ErrorAddr分配一个值
为异常分配一个错误地址需要使用保留字at使用格式如下
raise EInstance at Address_Expession;
自定义异常的应用举例
下面我们给出一个利用自定义异常编程的完整实例
两个标签框(LabelLabel)标示对应编辑框的功能编辑框PassWord和InputEdit用于输入口令和数字程序启动时LabelInputEdit不可见当在PassWord中输入正确的口令时LabelInputBox出现在屏幕上此时LabelPassWord隐藏
设计时令LabelInputEdit的Visible属性为False通过设置PassWord的PassWordChar可以确定输入口令时回显在屏幕上的字符
自定义异常EInvalidPassWord和EInvalidInput分别用于表示输入的口令非法和数字非法它们都是自定义异常EInValidation的子类而EInValidation直接从Exception异常类派生
下面是三个异常类的定义
type
EInValidation = class(Exception)
public
ErrorCode: Integer;
constructor Create(Const Msg: String;ErrorNum: Integer)
end;
EInvalidPassWord = class(EInValidation)
public
constructor Create;
end;
EInvalidInput = class(EInValidation)
public
constructor Create(ErrorNum: Integer)
end;
EInValidation增加了一个公有成员ErrorCode来保存错误代码错误代码的增加提供了很大的编程灵活性对于异常类可以根据错误代码提供不同的错误信息对于使用者可以通过截取错误代码在try…except模块之外来处理异常
从以上定义可以发现EInvalidPassWord和EInvalidInput的构造函数参数表中没有表示错误信息的参数事实上它们保存在构造函数内部下面是三个自定义异常类构造函数的实现代码
constructor EInValidationCreate(Const Msg: String; ErrorNum: Integer)
begin
inherited Create(Msg)
ErrorCode := ErrorNum;
end;
constructor EInValidPassWordCreate;
begin
inherited Create(Invalid Password Entered)
end;
constructor EInValidInputCreate(ErrorNum: Integer)
var
Msg: String;
begin
case ErrorNum of
:
Msg := Can not convert String to Number;
:
Msg := Number is out of Range;
else
Msg := Input is Invalid;
end;
inherited Create(MsgErrorNum)
end;
对于EInvalidInputErrorCode=表示输入的不是纯数字序列而ErrorCode=表示输入数值越界
[] [] [] []