try ... except ... end 形成異常回應保護區塊。與 finally 不同:正常情況 except 區塊不執行,異常發生時自動跳入 except 進行處理。異常回應後自動清除。
uses Dialogs;
var F: TextFile;
begin
OpenDialog1.Title := 'Delete File';
if OpenDialog1.Execute then
begin
AssignFile(F, OpenDialog1.FileName);
try
Reset(F);
if MessageDlg('Erase ' + OpenDialog1.FileName + '?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
CloseFile(F);
Erase(F);
end;
except
on EInOutError do
MessageDlg('File I/O error.', mtError, [mbOK], 0);
on EAccessDenied do
MessageDlg('File access denied.', mtError, [mbOK], 0);
end;
end;
end.
關鍵規則:except 後陳述式必須包含於 on ... do 區塊中,不可單獨存在(此點與 finally 不同)。
基本形式 on ExceptionType do 僅用類別型別。若需存取異常訊息、錯誤代碼等實例資料,需宣告暫存變數:
on EInstance: ExceptionType do ...
回應區塊內可像操作普通物件般存取其資料成員,區塊外不認可。
procedure TErrorForm.Button1Click(Sender: TObject);
begin
try
ScrollBar1.Max := ScrollBar1.Min - 1; { 觸發 EInvalidOperation }
except
on E: EInvalidOperation do
MessageDlg('Ignoring Exception: ' + E.Message, mtInformation, [mbOK], 0);
end;
end;
回應區塊通常僅處理特定異常。若發生未處理異常,會退出當前回應區塊且異常保留。為確保所有異常在當前區塊被清除,可定義預設回應:
try
{ 程式正常功能 }
except
on ESomething do
{ 回應特定異常 }
else
{ 提供預設回應 }
end;
else 可回應任何異常(含未知異常),預設回應建議僅顯示訊息框等輕量處理,避免改變程式狀態或資料。