參考http://www.cnblogs.com/dashan9zj/archive/2008/11/22/1338841.html
一.異常的來源
在Delphi應用程序中,下列的情況都比較有可能產生異常。
1.文件處理
2.內存分配
3.windows資源
4.運行時創建對象和窗體
5.硬件和操作系統沖突
6.網絡問題
7.數據庫
8.控件中的異常
9.DLL文件的異常
10.強制類型轉換
…………
二.異常的處理
1.try...except...end;
在try 體內的代碼發生異常時,系統將轉向except 部分進行異常的處理。這是Delphi處理異常的最基本的方式之一。
只有當try 體內的代碼發生異常時,才會跳轉到except 里面的代碼進行執行
2.try...finally...end;
這種異常處理結構一般用於保護windows的資源分配等方面,它確保了無論try 體內的代碼是否發生異常,都需要由系統進行最后的統一處理的一些Windows對象的正確處理
和try...except...ebd不同,該結構的finally部分總被執行
3.不存在try...except...finally...end 結構來既處理異常,又保護資源分配的結構,但是,try...except...end結構允許嵌套到try...finally...end結構中,從而既處理異常,又保護資源的分配
三.異常的精確處理
1.定義一個異常
在Delphi中,每個異常都是Exception類的一個派生類。因此,定義一個異常就是定義一個Exception類的派生類
type EMyException = class(Exception);
當然,基類可以是Exception或者是Exception的任何一個任何層次的派生類
2.在程序中拋出一個異常
根據不同的情況拋出異常是使用異常的最基本的模式。在Delphi中,由raise語句來實現
raise 異常類.Create('異常信息說明');
注意因為使用了 異常類.Create('異常信息說明'); 所以也就是在內存中創建了一個異常實體。
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;
或者直接使用:raise;
看一個代碼示例
var iTest: Integer; iStr: string; ... try iTest:= StrIntTo(iStr); except raise Exception.Create('拋出異常'); end;
上面的代碼可能會拋出異常,假如這是一個函數,那么在編程時候如果調用了這個函數的話不要忘記了要捕捉這個異常!
建議用法
建議使用raise 異常類.Create('異常信息說明');這樣的方式,以及另外兩個相似的語法方式,因為這樣可以在拋出異常的時候盡可能詳細的說明異常的情況,那么以后在捕捉異常的時候就可以又比較多的信息來讓我們了解到異常出現的地方,如果直接使用raise;的話
在except中使用raise 的時候,執行完raise的代碼之后,在except中的且在raise后的代碼將不會執行,它會在執行完raise 的代碼后直接跳出except,例程
var iTest: Integer; iStr: string; ... try iTest:= StrIntTo(iStr); except raise; ShowMessage('不會顯示'); end;
這個代碼例子,如果出現異常之后,會進入except,執行完 raise之后將不會執行ShowMessage的語句,而是直接跳出,所以在編程的時候一定要注意!!
如果想要在except中執行的代碼,一定要放在raise的前面!!
3.在try...except...end中更加精確的捕捉異常
可以使用 on E:異常類 do... 結構可以在 do 體內處理特定異常類所拋出的異常。
如果在except中使用 on E: 異常類 do... 的話,在except中的 on E: 異常類 do...之外不能有任何語句,例如下面的語法是正確的
try ... except on E: Exception do begin ShowMessage('OK'); ShowMessage('OK Again'); end; end;
但是下面的方式就錯了
try ... except on E: Exception do begin ShowMessage('OK'); end; ShowMessage('Not OK'); //如果在except中使用 on E: 異常類 do 的話,在except中的 on E: 異常類 do之外不能有任何語句 end;
四.常見應用場景下的異常處理
異常信息的處理方法(寫日志、拋出異常),函數或過程出現異常時,只能拋出異常,禁止彈出對話框架。
函數及過程、控件中發生異常,通常是直接拋出異常,不要顯示信息提示框;
界面操作(按鈕)中的異常,可以顯示提示信息(視具體應用而定),也可以不顯示提示而將異常信息保存到日志文件或兩種方式同時使用;
DLL文件中的異常:如果是函數或過程,發生異常時就直接拋出異常;如果是界面操作,則按界面操作(按鈕)中的異常處理方法處理。
五.異常的調試
1.如何設置才能進行異常調試
在Delphi IDE中,解除“Debugger Options”(可以使用菜單Tools->Debugger Options->OS Exception...進行訪問)中的Integrated Debugging復選框的勾選狀態可以進行異常的調試。
2.怎么能按照自己的異常處理來處理而不是報系統信息
另外還有一個可能會遇到的困惑:為什么明明自己在代碼中捕捉了異常並且進行了異常處理,但是最后顯示的還是系統的報錯框而不是我自己的處理效果。
解決方法:需要在Tools-> Debugger Options-> Language Exceptions 配置界面上的 Stop on Delphi Exceptions選項解除勾選,就會是按照自己的異常處理邏輯處理,而不是系統的報錯。
六.異常的補充說明
1.每一段程序都有可能出錯!這是軟件業的一個不容置疑的現象和規律。事實上,傳統的 if...else...結構完全可以解決所有的錯誤,使用 Exception 機制也沒能夠回避在最原始的層次,通過遍歷可能的情況來產生異常的做法,那么,為什么還需要異常機制
答案很簡單:異常提供了一種更加靈活和開放的方式,使得后來的編程者可以來根據實際的情況處理這種錯誤,而不是使用預先設定好的處理結果。實際上,這就是異常處理機制的核心