如何跳过嵌套块中的异常
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
处理程序都不需要 - 以上只是为了说明结构。
我的程序中有 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
处理程序都不需要 - 以上只是为了说明结构。