程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 基於Delphi的異常處理技術探究

基於Delphi的異常處理技術探究

編輯:Delphi

引言

在程序運行過程中,往往出現一些意外錯誤狀態而導致程序無法運行下去的情況。因此 在實現程序功能的同時,必須考慮如何處理程序運行過程中可能出現的各種異常情況。所謂異常是指打斷程序正常流程的、非常見或意外的狀態、打開文件時按路徑找不到文件、不能分配所需的內存等。現本人結合實際就Delphi中異常的產生、來源以及實現異常處理的方法進行探討。

異常的來源

異常可由一些不同的資源產生,用戶的程序可以因為不正常狀態產生異常,Delphi的組件可以因為不同的事件產生異常,把越界值賦給屬性或嘗試為不存在的數組元素建立索引, 運行的庫過程和函數也能產生異常,執行帶有非法操作的數學表達式,如被0除肯定是異常。 其他產生異常操作的例子包括:引用nil指針執行非法類型轉換的表達式等。總的來說,軟件在運行過程中遇到的情況千差萬別,因此產生異常的情況也各有不同。

傳統的異常處理方法

對於程序運行過程中產生的異常情況,傳統處理的方法主要是通過IF語句,布爾型標志和特別函數返回值來控制。如在加載文件時,采用條件語句,以處理可能產生的打開空文件的錯誤。

If Opendialog.Filename=nil then //判斷是否選擇文件
Begin
 ShowMessage(“ 選擇文件無效,請重新選擇一個文件”) ;
End;

以上例子是通過IF語句判斷到異常事件後,提示重新操作。這種異常處理方法當然很容易理解,但在軟件編寫的過程中,如果每個地方都使用IF語句來檢查錯誤並處理異常,會使編程工作變得較為繁雜。在Delphi中,這個問題可以用更簡便的方法來實現異常處理。

Delphi 中的異常處理方法

Delphi支持多種異常處理機制,Object Pascal提供了高級的異常處理機制。在這裡就兩種異常處理方法進行探討:

1、創建被保護語句塊

所謂被保護語句塊,簡單說是一條或多條語句,帶有對這些語句產生異常的處理器,運用try和except關鍵字來創建被保護語句塊的結構。具體結構如下:

Try  //可能引起異常的代碼段
···
except  //對異常進行處理的代碼段
···
end;

其中try和except為關鍵字,try用於標志可能產生異常的代碼段。如果這段程序在運行時產生了異常,系統會中止try代碼段的執行,並根據except所設的代碼段進行。

下面就如何利用這個結構來創建被保護語句塊研究一個程序的例子,具體的調用事件處理過程主要代碼如下:

var
 I,J,K:Integer;
Begin
 I:=0;J:=10;
Try
 K:=J DIV I; //產生異常的語句
Except
 ShowMessage (‘ Divede error!’ + ‘I=’+ IntToStr ( I ) + ‘J’ + IntToStr ( J ) +’k=’ + IntToStr ( K ));
End;

在這個過程中,表達式JdivI嘗試用10除以0,使Object Pascal運行庫產生一個異常,從而執行了except塊中的ShowMessage語句,這個保護語句控制程序的執行過程,主要有以下三個要點:

(1) 如果except塊中的一條語句處理了一個異常,過程或函數在保護塊後面繼續正常運行;

(2) 如果沒有語句處理異常,當前的過程或函數立即退出,異常查找調用鏈,直到找到合適的處理器;

(3) 未處理的異常最終找到應用程序的缺省異常處理器,處理器顯示對話框和消息 缺省異常處理器接收所有沒有提供處理的異常。

2、創建被保護資源塊

以上的例子顯示錯誤消息僅僅是異常處理的一個方面,當產生異常情況時,一個可靠的應用程序必須恢復穩定性。如果發生磁盤錯誤,應用程序必須釋放可能不用的內存快,直到用戶重新啟動;一個可靠的程序很容易排除錯誤,通過關閉文件,釋放Windows資源,用任何可能的方法從混亂中恢復。這種情況可用try 和finally關鍵字來創建被保護資源塊,所謂被保護資源塊,簡單說是由一條或多條語句組成,帶有對資源使用可能產生異常的處理器。 這個保護資源塊的基本框架結構為:

try     //程序語句
···
finally // 釋放的資源
···
end;

在這個結構中,不管try塊中的語句是否產生異常,finally塊中的語句總是要執行的,在典型的情況下finally塊中的語句釋放內存,關閉文件,執行其他必須完成的操作來恢復系統穩定性;如果是try塊外的語句產生異常,就會立刻引起過程或過程跳出,跳過finally塊。需要注意的一點是,分配語句不要放在try塊中,即使它將產生一個異常也是如此{例如由於RAM 的缺陷而使內存分配失誤};finally塊的目的是釋放資源,因此必須在try塊前放置分配語句,在該塊中,插入任何可以產生異常的語句,或可以讓過程或函數退出以讓分配的資源懸掛直到用戶重新啟動的語句。下面結合實際例子來探討這種技術,並且顯示如何使用被保護資源塊來防止懸掛資源,具體的過程主要代碼如下:

var
 I,J,K:Integer;
 P:Pointer;
Begin
 I:=0;J:=10;//給變量初值
 GETmem ( P,4098 );//分配內存資源
Try
 K:= J div I
 var
  I J K Integer;
  P Pointer;
 Begin
  I:=0;  J:=10;  //給變量初值
  GETmem(P,4098);  //分配內存資源
  Try
   K:=J div I;
  Except
   ShowMessage (‘ RRSULTS:’ ‘I’+ IntToStr ( I ) + ‘J’ + IntToStr ( J ) +’KI’ + IntToStr ( K ));
  Finally
   FreeMem ( P, 4098 ) ; //釋放內存資源
  ShowMessage( ‘已經釋放內存’)
End;

上述過程與被保護語句塊相似只是增加了一條分配內存的語句,這條語句調用GetMem 來保存4098 個字節的內存,當產生異常情況時,程序由於設置了被保護資源塊,使得占用內存的資源得以釋放。另外,程序中潛在的錯誤除法表達式存在於try塊中,如果除法不在try中,這條語句的執行就將產生異常,過程會立刻結束。

結束語

在程序中加入異常處理結構以達到對異常的控制,這種處理方法在編寫程序的過程中非常有用。有人可或許認為異常處理很復雜或者用處不大,其實異常處理並不復雜,無非是中斷產生異常的程序代碼,捕捉可能產生的異常並進行相應處理。掌握了這一基本方法後,就理解運用異常處理機制的重要性,以及如何使用異常處理機制了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved