delphi try except語句 和 try finally語句用法以及區別


一、異常的來源
  什么是異常程序開發過程中,有編譯期錯誤和運行期錯誤,編譯期錯誤很容易發現,而運行期錯誤(邏輯錯誤和異常)往往很難預料.為了程序的穩定性和可靠性,就需要對程序異常處理和保護.
  異常:理解為一種特殊的事件,該事件發生時,程序的正常執行將被打斷.由程序導致的不正常情況是錯誤而不是異常,程序錯誤與異常不是相同的概念.異常是為方便用戶報告錯誤並處理錯誤而創建的機制,一般是由操作系統完成的.運行期錯誤處理
  在Delphi的應用程序中,下列的情況都比較有可能產生異常。
  (1)文件處理  
  (2)內存分配  
  (3)Windows資源 
  (4)運行時創建對象和窗體  
  (5)硬件和操作系統沖突

二、異常的處理
  (1)try…except…end;  
  在try體內的代碼發生異常時,系統將轉向except部分進行異常的處理。這是Delphi處理異常的最基本的方式之一。
  
  (2)try…finally…end;  
  這種異常處理結構一般用於保護Windows的資源分配等方面,它確保了無論try體內的代碼是否發生異常,都需要由系統進行最后的統一處理的一些Windows對象的正確處理。  
  和try…except…end不同,該結構的finally部分總被執行。

  (3)不存在try…except…finally…end結構來既處理異常,又保護資源分配的結構,但是,try…except…end結構允許嵌套到try…finally…end結構中,從而實現既處理異常,又保護資源的分配。
  
三、異常的精確處理
  (1)定義一個異常。  
  在Delphi中,每個異常都是Exception[1]類的一個派生類[2]。因此,定義一個異常就是定義一個Exception類的派生類。  
  type EMyException = class(Exception);  
  當然,基類可以是Exception或者Exception的任何一個任何層次的派生類。
  
  (2)在程序中拋出一個異常。  
  根據不同的情況拋出異常是使用異常的最基本的模式。在Delphi中,由raise語句來實現。  
  【語法】raise 異常類.Create(‘異常的缺省說明’);
  
  (3)在try…except…end中更加精確的捕捉異常。  
  使用on E:異常類 do…結構可以在do體內處理特定異常類所拋出的異常。
  
四、異常的調試
  在Delphi IDE中,解除“Debugger Options”(可以使用菜單Tools—>Debugger Options…進行訪問)中的Integrated Debugging復選框的勾選狀態可以進行異常的調試。
  
五、異常的補充說明
  (1)每一段程序都有可能產生錯誤!這是軟件業的一個不容置疑的現象和規律。事實上,傳統的if…else…結構完全可以解決所有的錯誤,使用Exception機制也沒能夠回避在最原始的層次,通過遍歷可能的情況來產生異常的做法,那么,為什么還要異常機制

示例:

try//嘗試執行
    {SomeCode}   
except//出錯的時候執行, Except有特定的錯誤類型  
    {SomeCode}   
end; 

try//嘗試執行
{SomeCode}   
finally//無論如何都強制執行
{SomeCode}   
end; 

例:
try
    Age:=StrToInt(Edit1.Text);
    ShowMessage(Format('生於%d年',[YearOf(Now)-Age]));
except
    on EConvertError do
        showmessage('輸入編輯框的不是一個有效的數字!');
    on ERangeError do
        showmessage('輸入編輯框的年齡值太大!');
end;

 拋出異常代碼

begin
  raise Exception.Create('拋出異常');
end;
//例2:
begin
  raise Exception.CreateFmt('%s %d', ['錯誤代碼:', 999]);
end;

//例3:
var
  exc: Exception;
begin
  exc := Exception.Create('發現異常');
  raise exc;
end;

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM