首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 異常處理機制深度探究:try-except 與 try-finally 正確應用模式

     編輯:Delphi

異常來源分類

  • 程式邏輯錯誤(索引越界、空指標解參考、型別轉換失敗)
  • 元件/庫函式拋出(資料庫連線失敗、檔案存取拒絕)
  • 硬體/資源異常(記憶體不足、除零、磁碟 I/O 錯誤)

傳統錯誤碼模式缺陷

大量 if 判斷、布林旗標、特殊返回值散佈業務邏輯,導致程式碼膨脹、主流程不清晰、錯誤處理易遺漏。

Delphi 結構化異常處理兩大支柱

1. 受保護語句塊:try … except

用於捕獲並處理異常,保證程式可繼續執行。

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 子句,異常沿呼叫堆疊向上傳播,尋找外層處理器。
  • 最終無人處理 → 應用程式預設異常處理器顯示對話框。

2. 受保護資源塊:try … finally

用於確保資源釋放,無論是否發生異常、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;

黃金法則

  1. 資源配置(Create/GetMem/OpenFile)放在 try 之前。
  2. try 區塊僅放使用資源、可能拋出異常的業務邏輯。
  3. 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 程式的基石。異常處理不複雜,核心在於「中斷異常流→捕獲→處理/清理→恢復/傳播」,掌握此模式即可從容應對各類運行期意外。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved