什么是異常?為什么要用它?
所謂“異常”是指一個異常類的對象。Delphi的VCL中,所有異常類都派生於Exception類。該類聲明了異常的一般行為、性質。最重要的是,它有一個Message屬性可以報告異常發生的原因。
但需要強調的是,異常用來標志錯誤發生,卻並不因為錯誤發生而產生異常。產生異常僅僅是因為遇到了raise,在任何時候,即使沒有錯誤發生,raise都將會導致異常的發生。異常的發生,僅僅是因為raise,而非其他!采用拋出異常以處理意外情況,則可以保證程序主流程中的所有代碼可用,而不必加入繁雜的判斷語句。例如,函數A拋出異常:
- function A() : Integer;
- vat
- pFile : textfile;
- begin
- …… // 一些代碼
- pFile := SomeFunctionToOpenAnFile();
- if pFile = nil then
- raise Exception.Create(′Open file failed!′); // 文件打開失敗拋出異常
- Read(pFile, ……); // 讀文件
- …… // 其他一些對文件的操作,此時可以保證文件指針有效
- end;
函數A的代碼使得對文件打開的出錯處理非常簡單。如果打開文件失敗,則拋出一個Exception類的異常對象,函數立刻返回,從而保護了以下對文件指針的操作不被執行。拋出的異常也需要被捕獲和處理。假設函數B調用了函數A,要捕獲這個文件打開失敗的異常,就需要在調用A之前先預設一個陷阱,這個陷阱就是所謂的“try…except塊”。先看一下函數B的代碼:
- procedure B();
- begin
- …… // 一些代碼
- try
- A(); // 調用A
- SomeFunctionDependOnA(); // 依賴於A的結果的函數
- Except
- ShowMessage(′some error occured′); // 嘿嘿,掉進來了,發生異常
- End;
- …… // 繼續的代碼
- end;
A拋出的異常,會被B所設的try…except所捕獲。一旦捕獲到異常,就不再執行之后的敏感代碼,而是立刻跳至except塊執行錯誤處理,處理完成后再繼續執行整個try塊之后的代碼。程序流程的控制權被留在了函數B。
http://blog.csdn.net/sushengmiyan/article/details/7506421