程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第十二章-異常處理與程序調試(一)(1)

第十二章-異常處理與程序調試(一)(1)

編輯:Delphi

在應用程序開發中如何檢測、處理程序的運行錯誤是一個很重要的問題。在 Delphi 的集成開發環境( IDE )中提供了一個完善的內置調試器,可以幫助你發現大部分程序錯誤。但並不是所有的錯誤都可以被發現,而且當程序涉及到與外設的數據交換或操作外設,如要求用戶輸入、讀寫磁盤等時,錯誤的發生是程序無法控制的,如輸入非法字符、磁盤不能讀寫等。這些情況不僅會導致應用程序異常中止而且可能引起系統的崩潰。針對這些問題,Delphi同時提供了一套強大的異常處理機制。巧妙地利用它,可以使你的程序更為強健,使用更為友好。

雖然Delphi為應用程序提供了一套缺省的自動異常處理機制,即當前模塊發生錯誤後退出當前模塊並給出錯誤信息,而並不立即引起應用程序的中止。但當應用程序執行的過程性很強時,僅僅利用這種方法是不夠的,而且很容易導致程序執行的不可預測性。 

12.1 Delphi異常處理機制與異常類 

Delphi異常處理機制建立在保護塊(Protected Blocks)的概念上。所謂保護塊是用保留字try和end封裝的一段代碼。保護塊的作用是當應用程序發生錯誤時自動創建一個相應的異常類(Exception)。程序可以捕獲並處理這個異常類,以確保程序的正常結束以及資源的釋放和數據不受破壞。如果程序不進行處理,則系統會自動提供一個消息框。

異常類是Delphi異常處理機制的核心,也是Delphi異常處理的主要特色。下面我們對異常類的概念和體系進行詳細的介紹。

Delphi提供的所有異常類都是類Exception的子類。用戶也可以從Exception派生一個自定義的異常類。

Exception類的定義如下,對於不常用的成員沒有列出。  

{SysUtils 單元中}

Exception = class(TObject)

private

FMessage: PString;

FHelpContext: Longint;

function GetMessage: String;

procedure SetMessage(const Value: String);

public

constructor Create(const Msg: String);

constructor CreateFmt(const Msg: String; const Args: array of const);. . .

destructor Destroy; override;

property HelpContext: Longint

property Message: String;

property MessagePtr: PString;

end; 

Exception的一系列構造函數中最重要的參數是顯示的錯誤信息。而數據成員中最重要的也是可被引用的消息字符串(message,messagePtr)。 這些信息分別對自定義一個異常類和處理一個異常類有重要作用。

Delphi提供了一個很龐大的異常類體系,這些異常類幾乎涉及到編程的各個方面。從大的方面我們可以把異常類分為運行時間庫異常、對象異常、部件異常三類。下面我們分別進行介紹。 

12.1.1 運行時間庫異常類(RTL Exception) 

運行時間庫異常可以分為七類,它們都定義在SysUtils庫單元中。 

12.1.1.1 I/O異常 

I/O異常類EInOutError是在程序運行中試圖對文件或外設進行操作失敗後產生的,它從Exception派生後增加了一個公有數據成員ErrorCode,用於保存所發生錯誤的代碼。這一成員可用於在發生I/O異常後針對不同情況采取不同的對策。

當設置編譯指示{$I- } 時,不產生I/O異常類而是把錯誤代碼返回到預定義變量IOResult中。 

12.1.1.2 堆異常 

堆異常是在動態內存分配中產生的,包括兩個類EOutOfMemory和EInvalidPointer。

表12.1  堆異常類及其產生原因

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

異常類 引發原因

─────────────────────────────────

EOutOfMemory 沒有足夠的空間用於滿足所要求的內存分配

EInvalidPointer 非法指針。一般是由於程序試圖去釋放一個業已釋放的指針而引起的

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

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