on ExceptionType do 不僅回應該類別異常,也回應其子類別異常。系統不直接引發 EIntError、EMathError 等基類別,故它們僅回應子類別。on Exception do 則回應所有異常。
try
{ 整數運算 }
except
on ERangeError do
{ 越界單獨處理 }
on EIntError do
{ 其他整數異常統一處理 }
end;
異常處理後自動清除,上述順序確保 ERangeError 不被重複處理。若順序顛倒,ERangeError 永無執行機會(被父類別 EIntError 攔截)。
異常處理後即清除,若需多重處理(如同時設定變數值與釋放資源),需用 raise 重新引發當前異常:
var
APointer: Pointer;
AInt, ADiv: Integer;
begin
ADiv := 0;
GetMem(APointer, 1024);
try
try
AInt := 10 div ADiv;
except
on EDivByZero do
begin
AInt := 0;
raise; { 重新引發,交由外層 finally 釋放記憶體 }
end;
end;
finally
FreeMem(APointer, 1024);
end;
end;
展示異常保護(finally)與異常回應(except)巢狀結合,raise 讓外層 finally 得以執行資源釋放。
標準異常針對系統正常運行異常,自訂異常處理應用程式預設狀態異常:非法密碼、數據超出設定範圍、計算結果偏離預期等。使用步驟:
Exception 或標準異常);raise 類別實例)。