PL/SQL的异常处理
根据Exception来进行异常处理
PL/SQL的begin和end之间发生的异常通过在这个块中定义的exception来处理。同一块中没有异常处理定义的情况下,则引用上层的意外处理。
例如虽然捕捉了异常,但是在异常处理部分什么也没写的情况下什么也不会发生。但是如果不进行异常再调用,块内的异常处理被判断为执行,则不通知上层的块。
BEGIN
<程序段>
EXCEPTION
WHEN <异常名> THEN
<异常处理>
END;
带有异常处理的PL/SQL块定义
在异常处理中,如果有多个when,可以分开处理。
如果想同时处理多个异常,则用 when 异常名 or 异常名 or 。。。
例:发生的所有异常都是什么都不处理然后结束(不显示消息)。
DECLARE
vNum NUMBER(2);
BEGIN
vNum := 1 / 0;
DBMS_OUTPUT.PUT_LINE('数値=' || vNum);
EXCEPTION
WHEN OTHERS THEN
NULL; -- NULL; --什么都不处理
END;
/
Others异常是特殊的异常名,包括所有的异常。但是others不能和其他的异常一起进行处理。
多个例外处理的写法以及调用上层异常处理的方法
在发生除零例外的时候显示错误信息。在发生除零异常的时候,发生异常的本身不能向上层抛出。除零异常以外的所有异常发生的时候在异常处理的部分使用RAISE来向上层抛出这个异常。
DECLARE
vNum NUMBER(2);
BEGIN
-- ZERO DIVIDE EXCEPTION
vNum := 1 / 0;
DBMS_OUTPUT.PUT_LINE('数値=' || vNum);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('不能进行计算');
WHEN OTHERS THEN
-- < 异常処理 >
RAISE;
END;
/
Others异常是包括所有异常的异常名,必须要写在异常处理的最后,否则会出现变异错误(因为会把后面的异常处理器给覆盖)。
嵌套块的异常处理
DECLARE
vNum NUMBER(2);
BEGIN
BEGIN
-- ZERO DIVIDE EXCEPTION
vNum := 1 / 0;
EXCEPTION
WHEN ZERO_DIVIDE THEN
NULL;
END;
EXCEPTION
WHEN OTHERS THEN
< 异常処理 >
RAISE;
END;
/