熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:異常處理與程序調試(二)[2]

2013-11-23 17:50:26  來源: Delphi編程 

  下面的代碼同時使用了異常響應和異常保護異常響應用於設置變量的值異常保護用於釋放資源當異常響應結束時利用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=表示輸入數值越界

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25189.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.