所謂異常,就是指在程式運作過程中,由於程式本身的問題或是使用者不當的操做而造成的暫
停程序執行和出現錯誤結果的情況。用Delphi寫過程式的人對異常肯定不會陌生。異常的來源
是多方面的,引用空指標、賦值越界、被零除等都可以引發一個異常。如果對異常事件不進行適
當的處理,很可能導致整個程式的崩潰。還好Delphi對可能出現的幾乎所有的異常都能自動進行
處理。
一、Delphi自動處理異常的簡單例子
1.在Delphi(3.0)整合環境下,選取Tools | Environment Options選單,在出現的Environment
Options視窗中的PReferences頁面上有一個Break on exception選項(在左下部)。該選項在缺省
狀態下是被選取的,這樣在Delphi整合環境下執行程式若發生了異常,程式將自動被打斷而返回
Delphi偵錯狀態,遊標停留在出現異常的程式碼上,以便程式設計人員修改。現在單擊該選項使其不被
選中,然後確定。
2.新建一個工程,存為Excep.dpr(後面還有用),對應的單元存為Excpunit.pas;在Form1
中放入一個TmaskEdit構件,將其EditMask屬性設定為Date,再放入一個Tbutton構件,雙擊之,
編寫其OnClick事件如下:
procedure TForm1.BitBtn1Click(Sender: TObject);
var k:integer;
begin
k:=0;
k:=9 div k;{這裡將產生一個被0除的異常}
end;
3.盤並運行程序,在MaskEdit1中隨便寫入一兩個數字,回車,這時會產生(也稱為喚起)
一個異常,彈出如下視窗:
這是由於在MaskEdit框中輸入的資料不完整而產生了異常,Delphi自動進行了處理,單擊
“確定”後程序繼續執行。點選Button1按鈕,又會出現另一個類似窗口,因為這裡出現了一個被
零除的異常。
二、Delphi對異常情況的提示是英文的,對中國人不太習慣,我們可以截獲這些異常,實現用
中文提示。具體做法如下:
1.修改Button1的OnClick事件如下:
procedure TForm1.BitBtn1Click(Sender: TObject);
var k:integer;
begin
k:=0;
try
k:=9 div k;
except
showmessage(′除數不能為零′);
end;
end;
2.存檔並執行程序,點選Button1後出現的提示框將被中文的「除數不能為零」取代。利用
try......except......end語句是處理異常的常用方法,在保留字try後面的語句執行如果
出現異常,就執行保留字except與end間的語句,否則執行end後面的語句,從而取代了Delphi對
異常的預設處理。與之類似的另一個語句是try......finally......end,與try......except..
....end不同的是,不管try後的語句會不會產生異常,finally後面的語句是一定會被執行的。
但是,對於像TmaskEdit框產生的這類異常,用try語句就顯得無能為力了,因為我們找不到
寫try語句的地方。我們只能用另一種方法來解決。
三、Delphi中的每一個項目都有一個Tapplication對象,這是一個不可見的對象。我們可以
透過修改它的OnException事件,來實現對特殊異常的控制,具體做法如下:
1?麻痺?Form1的類別中宣告一個過程Myexception,該過程與Tapplication的OnException事件有
相同的參數:
public
{ Public declarations }
procedure MyException(Sender:TObject;E:Exception);
2.編寫該過程程式碼:
procedure TForm1.MyException(Sender:TObject;E:Exception);
begin
if E is EDBEditError then showmessage(′輸入不符合規則′)
else
Application.ShowException(E); {呼叫預設的例外處理}
end;
3.在Form1的OnCreate事件中為Tapplication的OnException事件賦值:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException :=MyException;
end;
4.存檔並運行程序,在MaskEdit框中隨便輸入一兩個數字,回車,一個中文的提示框將取
代原來的英文提示框。
四、這裡提醒大家注意三點:
1.Delphi把所有的異常歸納為一個類,即異常類(Exception),每一個特定的異常被視為
一個特例,在c:program files orlandDelphi 3source tlsys目錄下的sysutils.pas中
有關於Exception類別的定義。
2.Tapplication物件提供了一個過程HandleException來處理在程式中被喚起而未被處理的
異常事件,當我們為Tapplication的OnException事件賦值後,HandleException就會呼叫新的
過程來代替缺省的出錯訊息顯示。我們可以在自己的過程中自由地安排顯示的內容,以達到漢
化的效果。
3.我們透過IF判斷語句來取得指定的異常,用一個簡單的辦法可以得到指定異常的名稱。
回到文章開頭的例子,這裡我們把Break on exception選項選中,再次運行程序,輸入
不當的數字使MaskEdit1產生異常,這時將出現下面的視窗:
視窗中第二排的EDBEditError就是該異常的名稱,本文程式中的程式碼:
if E is EDBEditError then showmessage(′輸入不符合規定′)
就是根據這個名稱寫的。當不知道異常的確切名稱時,就可以從這裡獲得資訊。在用這種
方法處理異常事件時,一定要小心,應為你已經取代了Delphi的缺省的異常處理,如果處理不
當可能會使系統崩潰。
以上程式在Windows 95 Delphi 3.0下運行通過。