DELPHI基础教程:异常处理与程序调试(二)[2]

 我来答
黑科技1718
2022-11-11 · TA获得超过5810个赞
知道小有建树答主
回答量:433
采纳率:97%
帮助的人:79.1万
展开全部

  下面的代码同时使用了异常响应和异常保护 异常响应用于设置变量的值 异常保护用于释放资源 当异常响应结束时利用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 EPasswordInvalid Create( Incorrect Password entered )

  异常产生时把System库单元中定义的变量ErrorAddr的值置为应用程序产生异常处的地址 在你的异常处理过程中可以引用ErrorAddr的值

  在自己引发一个异常时 同样可以为ErrorAddr分配一个值

  为异常分配一个错误地址需要使用保留字at 使用格式如下

  raise EInstance at Address_Expession;

   自定义异常的应用举例

  下面我们给出一个利用自定义异常编程的完整实例

  两个标签框(Label Label )标示对应编辑框的功能 编辑框PassWord和InputEdit用于输入口令和数字 程序启动时Label InputEdit不可见 当在PassWord中输入正确的口令时 Label InputBox出现在屏幕上 此时Label PassWord隐藏

  设计时 令Label InputEdit的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 EInValidation Create(Const Msg: String; ErrorNum: Integer)

  begin

  inherited Create(Msg)

  ErrorCode := ErrorNum;

  end;

  constructor EInValidPassWord Create;

  begin

  inherited Create( Invalid Password Entered )

  end;

  constructor EInValidInput Create(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(Msg ErrorNum)

  end;

  对于EInvalidInput ErrorCode= 表示输入的不是纯数字序列 而ErrorCode= 表示输入数值越界

lishixinzhi/Article/program/Delphi/201311/25189

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式