基于Delphi的異常處理技術(shù)探究

字號:

引言
    在程序運行過程中,往往出現(xiàn)一些意外錯誤狀態(tài)而導(dǎo)致程序無法運行下去的情況。因此 在實現(xiàn)程序功能的同時,必須考慮如何處理程序運行過程中可能出現(xiàn)的各種異常情況。所謂異常是指打斷程序正常流程的、非常見或意外的狀態(tài)、打開文件時按路徑找不到文件、不能分配所需的內(nèi)存等。現(xiàn)本人結(jié)合實際就Delphi中異常的產(chǎn)生、來源以及實現(xiàn)異常處理的方法進(jìn)行探討。
    異常的來源
    異??捎梢恍┎煌馁Y源產(chǎn)生,用戶的程序可以因為不正常狀態(tài)產(chǎn)生異常,Delphi的組件可以因為不同的事件產(chǎn)生異常,把越界值賦給屬性或嘗試為不存在的數(shù)組元素建立索引, 運行的庫過程和函數(shù)也能產(chǎn)生異常,執(zhí)行帶有非法操作的數(shù)學(xué)表達(dá)式,如被0除肯定是異常。 其他產(chǎn)生異常操作的例子包括:引用nil指針執(zhí)行非法類型轉(zhuǎn)換的表達(dá)式等??偟膩碚f,軟件在運行過程中遇到的情況千差萬別,因此產(chǎn)生異常的情況也各有不同。
    傳統(tǒng)的異常處理方法
    對于程序運行過程中產(chǎn)生的異常情況,傳統(tǒng)處理的方法主要是通過IF語句,布爾型標(biāo)志和特別函數(shù)返回值來控制。如在加載文件時,采用條件語句,以處理可能產(chǎn)生的打開空文件的錯誤。
    If Opendialog.Filename=nil then //判斷是否選擇文件
    Begin
    ShowMessage(“ 選擇文件無效,請重新選擇一個文件”) ;
    End;
    以上例子是通過IF語句判斷到異常事件后,提示重新操作。這種異常處理方法當(dāng)然很容易理解,但在軟件編寫的過程中,如果每個地方都使用IF語句來檢查錯誤并處理異常,會使編程工作變得較為繁雜。在Delphi中,這個問題可以用更簡便的方法來實現(xiàn)異常處理。
    Delphi 中的異常處理方法
    Delphi支持多種異常處理機制,Object Pascal提供了高級的異常處理機制。在這里就兩種異常處理方法進(jìn)行探討:
    1、創(chuàng)建被保護(hù)語句塊
    所謂被保護(hù)語句塊,簡單說是一條或多條語句,帶有對這些語句產(chǎn)生異常的處理器,運用try和except關(guān)鍵字來創(chuàng)建被保護(hù)語句塊的結(jié)構(gòu)。具體結(jié)構(gòu)如下:
    Try  //可能引起異常的代碼段
    ···
    except  //對異常進(jìn)行處理的代碼段
    ···
    end;
    其中try和except為關(guān)鍵字,try用于標(biāo)志可能產(chǎn)生異常的代碼段。如果這段程序在運行時產(chǎn)生了異常,系統(tǒng)會中止try代碼段的執(zhí)行,并根據(jù)except所設(shè)的代碼段進(jìn)行。
    下面就如何利用這個結(jié)構(gòu)來創(chuàng)建被保護(hù)語句塊研究一個程序的例子,具體的調(diào)用事件處理過程主要代碼如下:
    var
    I,J,K:Integer;
    Begin
    I:=0;J:=10;
    Try
    K:=J DIV I; //產(chǎn)生異常的語句
    Except
    ShowMessage (‘ Divede error!’ + ‘I=’+ IntToStr ( I ) + ‘J’ + IntToStr ( J ) +’k=’ + IntToStr ( K ));
    End;