首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

PL/SQL 例外處理機制詳解:從基礎語法到進階傳播與自訂錯誤管理

     編輯:Oracle 資料庫基礎

PL/SQL 例外處理核心概念

PL/SQL 例外處理採用類似 Ada 的全包含錯誤管理機制。執行期錯誤發生時,程式無條件跳轉至 EXCEPTION 區塊,將錯誤處理邏輯與主流程分離,確保代碼清晰。僅執行期例外可被捕捉,編譯錯誤不在此列。

例外的三種拋出方式

  1. PL/SQL 執行引擎自動拋出: 資料庫或 PL/SQL 執行錯誤觸發。
  2. RAISE 陳述式: RAISE exception_name; 可拋出預定義或自訂例外。
  3. RAISE_APPLICATION_ERROR 預存程序: 攜帶自訂錯誤碼(-20999 至 -20000)與訊息拋出例外。

例外處理區塊結構

EXCEPTION
  WHEN exception_name1 THEN
    handling_code1;
  WHEN exception_name2 THEN
    handling_code2;
  WHEN OTHERS THEN
    default_handling_code;
  • 每個例外需獨立 WHEN 子句。
  • WHEN OTHERS 必須置於最後作為預設處理器。
  • 例外處理完成後,控制權返回上層區塊的下一條陳述式,不會 回到拋出例外的位置。

例外傳播機制

  • 未處理的例外沿呼叫堆疊向外傳播,直到被處理或到達最外層。
  • 宣告區拋出: 直接轉至上層區塊的 EXCEPTION 區。
  • 執行區拋出: 先嘗試同層 EXCEPTION,未捕捉則向上傳播。
  • 例外區拋出: 直接轉至上層區塊的 EXCEPTION 區。

重新拋出例外:RAISE 無參數呼叫

在例外處理器中執行紀錄、清理等動作後,使用 RAISE; 重新拋出原例外,使其繼續傳播。注意 DBMS_OUTPUT (512 bytes) 與 UTL_FILE (1000 bytes) 輸出長度限制,避免處理器內再次拋出未處理例外。

命名例外與自訂例外

預定義例外

Oracle 內建例外宣告於 STANDARD 套件,如 NO_DATA_FOUND、ZERO_DIVIDE 等。

自訂例外宣告

DECLARE
  my_exception EXCEPTION;
BEGIN
  RAISE my_exception;
EXCEPTION
  WHEN my_exception THEN ...
END;

作用域遵循變數規則:外層宣告的例外可被內層存取,內層宣告的例外不可被外層處理。同名自訂例外會遮蔽內建例外。

關聯資料庫錯誤碼:PRAGMA EXCEPTION_INIT

DECLARE
  invalid_table EXCEPTION;
  PRAGMA EXCEPTION_INIT(invalid_table, -942);
BEGIN
  ...
EXCEPTION
  WHEN invalid_table THEN ...
END;

錯誤資訊函數:SQLCODE / SQLERRM

  • SQLCODE:回傳當前資料庫錯誤碼(NO_DATA_FOUND 為 +100,其餘為負數)。
  • SQLERRM:回傳錯誤文字描述。
  • 自訂例外需搭配 RAISE_APPLICATION_ERROR 才能獲得有意義的 SQLCODE/SQLERRM。

RAISE_APPLICATION_ERROR 完整語法

RAISE_APPLICATION_ERROR(error_number, error_message [, {TRUE | FALSE}]);
  • error_number:-20999 至 -20000。
  • error_message:最長 2048 位元組。
  • 第三參數:TRUE 疊加至錯誤堆疊,FALSE (預設) 覆蓋。

關鍵限制與注意事項

  • GOTO 無法在執行區與例外區之間跳轉。
  • 例外處理器中避免產生新的未處理例外(如大量錯誤堆疊輸出超過緩衝區限制)。
  • 善用 WHEN OTHERS 記錄未預期錯誤,並重新拋出或轉換為應用層例外。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved