大量 if 判斷、布林旗標、特殊返回值散佈業務邏輯,導致程式碼膨脹、主流程不清晰、錯誤處理易遺漏。
用於捕獲並處理異常,保證程式可繼續執行。
try
// 可能引發異常的程式碼
K := J div I; // I=0 觸發 EDivByZero
except
on E: EDivByZero do
ShowMessage('除零錯誤: ' + E.Message);
on E: Exception do
ShowMessage('其他異常: ' + E.ClassName + ' - ' + E.Message);
end;
// 異常處理後,程式繼續往下執行
except 區塊處理異常後,控制流離開 try-except 繼續後續程式碼。on 子句,異常沿呼叫堆疊向上傳播,尋找外層處理器。用於確保資源釋放,無論是否發生異常、Exit、Break 甚至異常傳播,finally 區塊必定執行。
var
P: Pointer;
I, J, K: Integer;
begin
I := 0; J := 10;
GetMem(P, 4096); // 分配資源放在 try 之前
try
K := J div I; // 觸發異常
except
ShowMessage('異常已捕獲');
finally
FreeMem(P, 4096); // 必定釋放記憶體
ShowMessage('記憶體已釋放');
end;
end;
Create/GetMem/OpenFile)放在 try 之前。try 區塊僅放使用資源、可能拋出異常的業務邏輯。finally 區塊專職釋放資源(Free/FreeMem/CloseFile)。// 錯誤:配置在 try 內,若配置本身失敗(罕見但可能),finally 會嘗試釋放未初始化變數
try
GetMem(P, 4096);
// ...
finally
FreeMem(P, 4096);
end;
Query := TQuery.Create(nil);
try
Stream := TMemoryStream.Create;
try
// 使用 Query、Stream
finally
Stream.Free;
end;
finally
Query.Free;
end;
type
EMyAppError = class(Exception)
public
ErrorCode: Integer;
constructor Create(const Msg: string; ACode: Integer);
end;
raise EMyAppError.Create('資料驗證失敗', ERR_VALIDATE);
善用 try-except 處理業務異常、try-finally 守護資源釋放,是編寫健壯 Delphi 程式的基石。異常處理不複雜,核心在於「中斷異常流→捕獲→處理/清理→恢復/傳播」,掌握此模式即可從容應對各類運行期意外。