基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
异常处理的流程
更新时间:2023-11-06 10:12:14
异常错误可以出现在声明部分、执行部分以及异常处理部分,在不同部分引发的异常错误处理流程会有不同。
在执行部分引发的异常
当一个异常错误在执行部分引发时,分为以下两种情况进行错误处理:
情况一:如果当前 PL 块对该异常错误设置了处理,则执行该处理方式并成功完成块的执行,然后将控制转给外层块。
情况二:如果当前 PL 块没有在异常处理部分捕获该异常,则说明是在上层块的执行中引发该异常。然后重复情况一的执行步骤。
示例如下:
obclient> BEGIN
DECLARE
v_sal employees.salary%TYPE;
BEGIN
SELECT salary INTO v_sal FROM employees
WHERE empno=100;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-INNER');
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-OUTER');
END;
/
Query OK, 0 rows affected
-4026-INNER
当删除了内层块的异常处理之后, 异常被外层块捕获。示例如下:
obclient> BEGIN
DECLARE
v_sal employees.salary%TYPE;
BEGIN
SELECT salary INTO v_sal FROM employees
WHERE empno=100;
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-OUTER');
END;
/
Query OK, 0 rows affected
-4026-OUTER
在声明部分引发的异常
在声明部分引起异常只能被外层块捕获到,而无法被当前块的异常处理捕获。
obclient> BEGIN
DECLARE
abc number(3):='a';
BEGIN
null;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-INNER');
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-OUTER');
END;
/
Query OK, 0 rows affected
-5114-OUTER
对异常进行处理
在一般的应用处理中,建议程序人员要对异常进行捕捉和处理。如果异常得不到妥善处理,程序运行出错时就会被终止,并且无法为后续的错误排查提供足够的诊断信息。