如何跳过嵌套块中的异常

How to skip exception in nested block

我的程序中有 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 和 outer 块,甚至在 inner1 块中引发异常?

因为您在 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 处理程序都不需要 - 以上只是为了说明结构。