熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:異常處理與程序調試(一)[1]

2013-11-23 17:50:54  來源: Delphi編程 

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

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

   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的一系列構造函數中最重要的參數是顯示的錯誤信息而數據成員中最重要的也是可被引用的消息字符串(messagemessagePtr) 這些信息分別對自定義一個異常類和處理一個異常類有重要作用

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

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

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

   I/O異常

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

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

   堆異常

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

  表  堆異常類及其產生原因

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

  異常類 引發原因

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

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

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

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

    整數異常

  整數異常都是從一個EIntError類派生的但程序運行中引發的總是它的子類EDivByZeroERangeErrorEIntOverFlow

  表  整數異常及其產生原因

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

  異常類 引發原因

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

  EDivByZero 試圖被零除

  ERangeError 整數表達式越界

  EIntOverFlow 整數操作溢出

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

  ERangeError當一個整數表達式的值超過為一個特定整數類型分配的范圍時引發比如下面一段代碼將引發一個ERangeError異常

  var

  SmallNumber: ShortInt;

  X Y: Integer;

  begin

  X := ;

  Y := ;

  SmallNumber := X * Y;

  end;

  特定整數類型包括ShortIntByte以及與整數兼容的枚舉類型布爾類型等例如

  type

  THazard = ( Safety Marginal Critical Catastrophic )

  var

  Haz: THazard;

  Item: Integer;

  begin

  Item:= ;

  Haz:= THazard ( Item )

  end;

  由於枚舉數越界而引發一個ERangeError異常

  數組元素越界也會引發一個ERangeError異常

  var

  Values: array[] of Integer;

  i: Integer;

  begin

  for i := to do

  Values[i] := i;

  end;

  ERangeError異常只有當類型檢查打開時才會引發這可以在代碼中包含{$R+} 編譯指示或設置IDE Option|Project的Range_Checking Option選擇框

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25191.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.