12.1.3 部件異常類
12.1.3.1 通用部件異常類
通用部件異常類常用的有三個:EInvalidOperation、EComponentError、EOutOfResource。其中EInvalidOperation、EOutOfResource在Controls單元中定義;EComponentError在Classes單元中定義。
1.非法操作異常 EInvalidOperation
EInvalidOperation 引發的原因可能有:
● 應用程序試圖對一個Parent屬性為nil的部件進行一些需要Windows句柄的操作
● 試圖對一個窗口進行拖放操作
● 操作違反了部件屬性間內置的相互關系等
例如,ScrollBar、Gauge等部件要求Max屬性大於等於Min屬性,因而下面的語句:
ScrollBar1.Max := ScrollBar1.Min-1;
將引發一個EInvalidOperation異常。
2.部件異常EComponentError
引發該異常的原因可能有:
● 在Register過程之外試圖登錄一個部件(常用於自定義部件開發中)
● 應用程序在運行中改變了一個部件的名稱並使該部件與另一個部件重名
● 一個部件的名稱改變為一個Object Pascal非法的標識符
● 動態生成一個部件與已存在的另一部件重名
3.資源耗盡異常EOutOfResource
當應用程序試圖創建一個Windows句柄而Windows 卻沒有多余的句柄分配時引發該異常。
12.1.3.2 專用部件異常類
許多部件都定義了相應的部件異常類。但並不是有關部件的任何錯誤都會引發相應的異常類。許多情況下它們將引發一個運行時間異常或對象異常。
下面列出幾個典型的部件異常類。
1.EMenuError
非法的菜單操作,例如試圖刪除一個不存在的菜單項。這一異常類在Menus庫單元中定義。
2.EInvalidGridOpertion
非法的網格操作,比如試圖引用一個不存在的網格單元。這一異常類在Grids庫單元中定義。
3.EDDEError
DDE異常。比如應用程序找不到特定的服務器或會話,或者一個聯接意外中止。這一異常類在DDEMan庫單元中定義。
4.EDatabaseError,EReportError
數據庫異常(EDatabaseError)和報表異常(EReportError) 在進行數據庫和報表操作出現錯誤時引發。有關數據庫的問題請讀者參閱本書第二編。
12.1.4 小結
在這一節中重點介紹了Delphi提供的異常類體系。我們力求給讀者一個清晰、全面的印象,使讀者能在自己的程序開發中實際使用它們。為便於理解我們也提供了一些簡單的說明性示例。雖然在具體的使用中讀者還可能會碰到許多問題,但意識到應該用異常類來增強程序的健壯性卻是程序設計水平走上新台階的標志。
12.2 異常保護
確保回收分配的資源是程序健壯性的一個關鍵。但缺省情況下異常發生時程序會在出錯點自動退出當前模塊,因此需要一種特殊的機制來確保即使在異常發生的情況下釋放資源的語句仍能被執行。而Delphi的異常處理正提供了這種機制。
12.2.1 需要保護的資源
一般說來需要保護的資源包括:
● 文件
● 內存
● Windows資源
● 對象
比如下面一段程序就會造成1K內存資源的丟失。
var
APointer : Pointer ;
AInt , ADiv: Integer ;
begin
ADiv := 0;
GetMem ( APointer , 1024 );
AInt := 10 div ADiv ;
FreeMem ( Apointer , 1024 );
end;
由於程序從異常發生點退出從而FreeMem永遠沒有執行的機會。