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

Oracle 異常處理最佳實踐:捕獲完整錯誤堆棧 (SQLCODE/SQLERRM/FORMAT_ERROR_STACK/BACKTRACE/CALL_STACK)

     編輯:Oracle 資料庫基礎

核心異常處理模板

DECLARE
  v_name VARCHAR2(20) := 'DataNotFound';
BEGIN
  IF v_name = 'DivideIsZero' THEN
    RAISE ZERO_DIVIDE;
  ELSIF v_name = 'DataNotFound' THEN
    RAISE NO_DATA_FOUND;
  END IF;
EXCEPTION
  WHEN ZERO_DIVIDE THEN
    DBMS_OUTPUT.PUT_LINE('EXCEPTION IN ZERO_DIVIDE');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('EXCEPTION IN OTHERS');
    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'SQLCODE: ' || SQLCODE);
    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'SQLERRM: ' || SQLERRM);
    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'DBMS_UTILITY.FORMAT_ERROR_STACK:');
    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);
    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'DBMS_UTILITY.FORMAT_ERROR_BACKTRACE:');
    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
    DBMS_OUTPUT.PUT_LINE(CHR(10) || 'DBMS_UTILITY.FORMAT_CALL_STACK:');
    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_CALL_STACK);
END;

輸出字段解析

函數含義示例輸出
SQLCODEOracle 錯誤號 (正數為用戶自定義異常)100 (NO_DATA_FOUND)
SQLERRM錯誤號對應的完整文本ORA-01403: 未找到數據
FORMAT_ERROR_STACK完整錯誤消息堆棧 (含嵌套異常)ORA-01403: 未找到數據
FORMAT_ERROR_BACKTRACE**異常拋出點**的行號/對象 (10g+)ORA-06512: 在 line 12
FORMAT_CALL_STACK**當前執行點**的調用棧 (對象/行/名稱)----- PL/SQL Call Stack -----
object handle line object
673AAB40 46 anonymous block

工程化落地建議

  1. 統一異常日志表:ERR_LOG (err_time, err_user, err_module, sqlcode, sqlerrm, error_stack, backtrace, call_stack, bind_vars)。
  2. 所有服務層存儲過程 **強制** 在 WHEN OTHERS 中記錄上述 5 字段並 RAISE 或返回錯誤碼,嚴禁吞沒異常。
  3. 利用 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 快速定位拋出行,結合 FORMAT_CALL_STACK 還原調用鏈。
  4. 12c+ 可用 UTL_CALL_STACK 獲取結構化調用棧 (數組),便於程序化解析。

實戰輸出片段

EXCEPTION IN OTHERS
SQLCODE: 100
SQLERRM: ORA-01403: 未找到數據
DBMS_UTILITY.FORMAT_ERROR_STACK:
ORA-01403: 未找到數據
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE:
ORA-06512: 在 line 12
DBMS_UTILITY.FORMAT_CALL_STACK:
----- PL/SQL Call Stack -----
object handle line object
673AAB40 46 anonymous block
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved