如何在嵌套块中跳过异常

时间:2017-09-13 05:07:53

标签: oracle plsql exception-handling plsqldeveloper

我的程序中有2个嵌套块。如果第一个嵌套块中发生任何错误,则程序将不再执行,它将转到异常部分并退出整个程序。 但我不想退出我的计划。我的程序需要为第二个嵌套块执行,而且,甚至在第一个嵌套块中引发异常。

如果我有这样的程序:

DECLARE
    var_out VARCHAR2(10):= 'OUTER';
BEGIN
    <<INNER1>>
    DECLARE
        var_in1  NUMBER:='INNER 1';
    BEGIN
        DBMS_OUTPUT.PUT_LINE(var_in1);
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE(SQLERRM);
    END;

    <<INNER2>>
    DECLARE
        var_in2 VARCHAR2(10):='INNER 2';
    BEGIN
        DBMS_OUTPUT.PUT_LINE(var_in2);
    EXCEPTION
        WHEN OTHERS THEN 
            DBMS_OUTPUT.PUT_LINE(SQLERRM);
    END;
    DBMS_OUTPUT.PUT_LINE(var_out);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

在我的程序中,inner1块将抛出value error exception,因此整个程序将不会被执行。

如何执行inner2和外部块,甚至是在inner1块中引发的异常?

1 个答案:

答案 0 :(得分:0)

因为INNER1中的异常发生在声明部分中,所以它超出了块的异常处理程序的范围。您需要使用自己的异常处理程序将整个INNER1块包装在另一个块中。

declare
    var_out varchar2(10):= 'OUTER';
begin
    <<INNER1>>
    begin
        declare
            var_in1  number:='INNER 1';
        begin
            dbms_output.put_line(var_in1);
        exception
            when others then
                dbms_output.put_line('Error in innermost INNER1');
        end;
    exception
        when others then
            dbms_output.put_line('Error in INNER1 wrapper');
    end;

    <<INNER2>>
    declare
        var_in2 varchar2(10):='INNER 2';
    begin
        dbms_output.put_line(var_in2);
    exception
        when others then 
            dbms_output.put_line('Error in INNER2');
    end;
    dbms_output.put_line(var_out);
exception
    when others then
        dbms_output.put_line('Error at top level');
end;

输出:

Error in INNER1 wrapper
INNER 2
OUTER

可能不需要OTHERS个处理程序 - 上面只是为了说明结构。