首頁 考試吧論壇 Exam8視線 考試商城 網絡課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載 | ||
![]() |
2011中考 | 2011高考 | 2012考研 | 考研培訓 | 在職研 | 自學考試 | 成人高考 | 法律碩士 | MBA考試 MPA考試 | 中科院 |
|
![]() |
四六級 | 職稱英語 | 商務英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT 新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學習 | 法語 | 德語 | 韓語 |
|
![]() |
計算機等級考試 | 軟件水平考試 | 職稱計算機 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證 華為認證 | Java認證 |
|
![]() |
公務員 | 報關員 | 銀行從業資格 | 證券從業資格 | 期貨從業資格 | 司法考試 | 法律顧問 | 導游資格 報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師 人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業資格 | 廣告師職業水平 駕駛員 | 網絡編輯 |
|
![]() |
衛生資格 | 執業醫師 | 執業藥師 | 執業護士 | |
![]() |
會計從業資格考試(會計證) | 經濟師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務師 注冊資產評估師 | 高級會計師 | ACCA | 統計師 | 精算師 | 理財規劃師 | 國際內審師 |
|
![]() |
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監理工程師 | 安全工程師 質量工程師 | 物業管理師 | 招標師 | 結構工程師 | 建筑師 | 房地產估價師 | 土地估價師 | 巖土師 設備監理師 | 房地產經紀人 | 投資項目管理師 | 土地登記代理人 | 環境影響評價師 | 環保工程師 城市規劃師 | 公路監理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師 |
|
![]() |
繽紛校園 | 實用文檔 | 英語學習 | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲 |
12.3.5 自定義異常類的應用
利用Delphi的異常類機制我們可以定義自己的異常類來處理程序執行中的異常情況。同標準異常不同的是:這種異常情況并不是相對于系統的正常運行,而是應用程序的預設定狀態。比如輸入一個非法的口令、輸入數據值超出設定范圍、計算結果偏離預計值等等。
使用自定義異常需要:
1.自己定義一個異常對象類;
2.自己引發一個異常。
12.3.5.1 定義異常對象類
異常是對象,所以定義一類新的異常同定義一個新的對象類型并無太大區別。由于缺省異常處理只處理從Exception或Exception子類繼承的對象,因而自定義異常類應該作為Exception或其它標準異常類的子類。這樣,假如在一個模塊中引發了一個新定義的異常,而這個模塊并沒有包含對應的異常響應,則缺省異常處理機制將響應該異常,顯示一個包含異常類名稱和錯誤信息的消息框。
下面是一個異常類的定義:
type
EMyException = Class(Exception) ;
12.3.5.2 自引發異常
引發一個異常,調用保留字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;
12.3.5.3 自定義異常的應用舉例
下面我們給出一個利用自定義異常編程的完整實例。
兩個標簽框(Label1、Label2)標示對應編輯框的功能。編輯框PassWord和InputEdit用于輸入口令和數字。程序啟動時Label2、InputEdit不可見。當在PassWord中輸入正確的口令時,Label2、InputBox出現在屏幕上。此時Label1、PassWord隱藏。
設計時,令Label2、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',0);
end;
constructor EInValidInput.Create(ErrorNum: Integer);
var
Msg: String;
begin
case ErrorNum of
1:
Msg := 'Can not convert String to Number';
2:
Msg := 'Number is out of Range';
else
Msg := 'Input is Invalid';
end;
inherited Create(Msg,ErrorNum);
end;
對于EInvalidInput,ErrorCode=1表示輸入的不是純數字序列,而ErrorCode=2表示輸入數值越界。
口令檢查是用戶在PassWord中輸入口令并按下回車鍵后開始的。實現代碼在PassWord的OnKeyPress事件處理過程中:
procedure TForm1.PassWordKeyPress(Sender: TObject; var Key: Char);
const
CurrentPassWord = 'Delphi';
begin
if Key = #13 then
begin
try
if PassWord.text <> CurrentPassWord then
raise EInvalidPassWord.Create;
Label2.Visible := True;
InputEdit.Visible := True;
InputEdit.SetFocus;
PassWord.Visible := False;
Label1.Visible := False;
except
on EInvalidPassWord do
begin
PassWord.text := '';
raise;
end;
end;
Key:=#0;
end;
end;
同樣,在InputEdit的OnKryPress事件處理過程中實現了輸入數字的合法性檢查:
procedure TForm1.InputEditKeyPress(Sender: TObject; var Key: Char);
var
Res: Real;
Code: Integer;
begin
if Key = #13 then
begin
try
val(InputEdit.text,Res,Code);
if Code <> 0 then
raise EInValidInput.create(1);
if (Res > 1) or (Res < 0) then
raise EInValidInput.create(2);
MessageDlg('Correct Input', mtInformation,[mbOk], 0);
Key := #0;
except
on E:EInValidInput do
begin
InputEdit.text := '';
MessageDlg(E.Message, mtWarning,[mbOk], 0);
end;
end;
end;
end;
由于異常響應后即被清除,所以要顯示異常信息,需要另外的手段。在以上兩段程序中我們采用了兩種不同的方法:在口令合法性檢查中,利用異常重引發由系統進行缺省響應;在輸入數字合法性檢查中,通過異常實例來獲取異常信息并由自己來顯示它。
以上所舉的是一個非常簡單的例子,但從中已可以發現:使用自定義異常編程,為程序設計帶來了很大的靈活性。
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |