人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

第12章 異常處理與程序調試(一)

第12章 異常處理與程序調試(一)

更新時間:2022-07-12 文章作者:未知 信息來源:網絡 閱讀次數:

在應用程序開發中如何檢測、處理程序的運行錯誤是一個很重要的問題。在 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 非法指針。一般是由于程序試圖去釋放一個業已釋放的指針而引起的

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

  

  12.1.1.3  整數異常 

  整數異常都是從一個EIntError類派生的,但程序運行中引發的總是它的子類:EDivByZero,ERangeError,EIntOverFlow。 

   表12.2  整數異常及其產生原因

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

  異常類 引發原因

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

  EDivByZero 試圖被零除

  ERangeError 整數表達式越界

  EIntOverFlow 整數操作溢出

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

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

  var

  SmallNumber: ShortInt;

  X , Y: Integer;

  begin

  X := 100;

  Y := 75;

  SmallNumber := X * Y;

  end;

  特定整數類型包括ShortInt、Byte以及與整數兼容的枚舉類型、布爾類型等。例如:  

  type

  THazard = ( Safety , Marginal , Critical , Catastrophic );

  var

  Haz: THazard;

  Item: Integer;

  begin

  Item:= 4;

  Haz:= THazard ( Item );

  end; 

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

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

  var

  Values: array[1..10] of Integer;

  i: Integer;

  begin

  for i := 1 to 11 do

  Values[i] := i;

  end;

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

  EIntOverFlow異常類在Integer、Word、Longint三種整數類型越界時引發。如:

  var

  I : Integer;

  a,b,c : Word;

  begin

  a := 10;

  b := 20;

  c := 1;

  for I := 0 to 100 do

  begin

  c := a*b*c;

  end;

  end;

  引發一個EIntOverFlow異常。

  EIntOverFlow異常類只有在編譯選擇框Option|Project|Over_Flow_Check Option選中時才產生。當關閉溢出檢查,則溢出后變量保留該類整數的最大范圍值。

  整數類型的范圍如下表。 

[1] [2] [3]  下一頁

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 冷水江市| 临桂县| 高要市| 河曲县| 东宁县| 双牌县| 东乌珠穆沁旗| 泗洪县| 永仁县| 绥芬河市| 漳州市| 鹤岗市| 墨玉县| 开江县| 烟台市| 新安县| 潜山县| 蒙阴县| 海南省| 龙江县| 靖江市| 册亨县| 敦煌市| 岐山县| 新昌县| 天台县| 阿勒泰市| 依兰县| 开阳县| 马山县| 顺义区| 进贤县| 西林县| 武山县| 罗田县| 云安县| 南通市| 沽源县| 驻马店市| 桦甸市| 崇明县|