在程序運行過程中
往往出現一些意外錯誤狀態而導致程序無法運行下去的情況
因此 在實現程序功能的同時
必須考慮如何處理程序運行過程中可能出現的各種異常情況
所謂異常是指打斷程序正常流程的
非常見或意外的狀態
打開文件時按路徑找不到文件
不能分配所需的內存等
現本人結合實際就Delphi中異常的產生
來源以及實現異常處理的方法進行探討
異常的來源 異常可由一些不同的資源產生
用戶的程序可以因為不正常狀態產生異常
Delphi的組件可以因為不同的事件產生異常
把越界值賦給屬性或嘗試為不存在的數組元素建立索引
運行的庫過程和函數也能產生異常
執行帶有非法操作的數學表達式
如被0除肯定是異常
其他產生異常操作的例子包括
引用nil指針執行非法類型轉換的表達式等
總的來說
軟件在運行過程中遇到的情況千差萬別
因此產生異常的情況也各有不同
傳統的異常處理方法 對於程序運行過程中產生的異常情況
傳統處理的方法主要是通過IF語句
布爾型標志和特別函數返回值來控制
如在加載文件時
采用條件語句
以處理可能產生的打開空文件的錯誤
If Opendialog
Filename=nil then //判斷是否選擇文件
Begin
ShowMessage(
選擇文件無效
請重新選擇一個文件
)
End
以上例子是通過IF語句判斷到異常事件後
提示重新操作
這種異常處理方法當然很容易理解
但在軟件編寫的過程中
如果每個地方都使用IF語句來檢查錯誤並處理異常
會使編程工作變得較為繁雜
在Delphi中
這個問題可以用更簡便的方法來實現異常處理
Delphi 中的異常處理方法 Delphi支持多種異常處理機制
Object Pascal提供了高級的異常處理機制
在這裡就兩種異常處理方法進行探討
創建被保護語句塊
所謂被保護語句塊
簡單說是一條或多條語句
帶有對這些語句產生異常的處理器
運用try和except關鍵字來創建被保護語句塊的結構
具體結構如下
Try //可能引起異常的代碼段
···
except //對異常進行處理的代碼段
···
end
其中try和except為關鍵字
try用於標志可能產生異常的代碼段
如果這段程序在運行時產生了異常
系統會中止try代碼段的執行
並根據except所設的代碼段進行
下面就如何利用這個結構來創建被保護語句塊研究一個程序的例子
具體的調用事件處理過程主要代碼如下
var
I
J
K
Integer
Begin
I
=
J
=
Try
K
=J DIV I
//產生異常的語句
Except
ShowMessage (
Divede error!
+
I=
+ IntToStr ( I ) +
J
+ IntToStr ( J ) +
k=
+ IntToStr ( K ))
End
在這個過程中
表達式JdivI嘗試用
除以
使Object Pascal運行庫產生一個異常
從而執行了except塊中的ShowMessage語句
這個保護語句控制程序的執行過程
主要有以下三個要點
(
) 如果except塊中的一條語句處理了一個異常
過程或函數在保護塊後面繼續正常運行
(
) 如果沒有語句處理異常
當前的過程或函數立即退出
異常查找調用鏈
直到找到合適的處理器
(
) 未處理的異常最終找到應用程序的缺省異常處理器
處理器顯示對話框和消息 缺省異常處理器接收所有沒有提供處理的異常
創建被保護資源塊
以上的例子顯示錯誤消息僅僅是異常處理的一個方面
當產生異常情況時
一個可靠的應用程序必須恢復穩定性
如果發生磁盤錯誤
應用程序必須釋放可能不用的內存快
直到用戶重新啟動
一個可靠的程序很容易排除錯誤
通過關閉文件
釋放Windows資源
用任何可能的方法從混亂中恢復
這種情況可用try 和finally關鍵字來創建被保護資源塊
所謂被保護資源塊
簡單說是由一條或多條語句組成
帶有對資源使用可能產生異常的處理器
這個保護資源塊的基本框架結構為
try //程序語句
···
finally // 釋放的資源
···
end
在這個結構中
不管try塊中的語句是否產生異常
finally塊中的語句總是要執行的
在典型的情況下finally塊中的語句釋放內存
關閉文件
執行其他必須完成的操作來恢復系統穩定性
如果是try塊外的語句產生異常
就會立刻引起過程或過程跳出
跳過finally塊
需要注意的一點是
分配語句不要放在try塊中
即使它將產生一個異常也是如此{例如由於RAM 的缺陷而使內存分配失誤}
finally塊的目的是釋放資源
因此必須在try塊前放置分配語句
在該塊中
插入任何可以產生異常的語句
或可以讓過程或函數退出以讓分配的資源懸掛直到用戶重新啟動的語句
下面結合實際例子來探討這種技術
並且顯示如何使用被保護資源塊來防止懸掛資源
具體的過程主要代碼如下
var
I
J
K
Integer
P
Pointer
Begin
I
=
J
=
//給變量初值
GETmem ( P
)
//分配內存資源
Try
K
= J div I
var
I J K Integer
P Pointer
Begin
I
=
J
=
//給變量初值
GETmem(P
)
//分配內存資源
Try
K
=J div I
Except
ShowMessage (
RRSULTS
I
+ IntToStr ( I ) +
J
+ IntToStr ( J ) +
KI
+ IntToStr ( K ))
Finally
FreeMem ( P
) ; //釋放內存資源
ShowMessage(
已經釋放內存
)
End
上述過程與被保護語句塊相似只是增加了一條分配內存的語句
這條語句調用GetMem 來保存4098 個字節的內存
當產生異常情況時
程序由於設置了被保護資源塊
使得占用內存的資源得以釋放
另外
程序中潛在的錯誤除法表達式存在於try塊中
如果除法不在try中
這條語句的執行就將產生異常
過程會立刻結束
結束語 在程序中加入異常處理結構以達到對異常的控制
這種處理方法在編寫程序的過程中非常有用
有人可或許認為異常處理很復雜或者用處不大
其實異常處理並不復雜
無非是中斷產生異常的程序代碼
捕捉可能產生的異常並進行相應處理
掌握了這一基本方法後
就理解運用異常處理機制的重要性
以及如何使用異常處理機制了
From:http://tw.wingwit.com/Article/program/Delphi/201311/24897.html