有人可以帮我确认一下,如果我正在运行一个包含多个代码块的 PLSQL 脚本并且我捕获了一个错误 - 是否使用它自己的“RAISE”命令跳过到脚本末尾的异常处理或将它继续运行剩余的代码块吗?或者,如果我使用 'RAISE handle_tns_error' 引发异常,其中 handle_tns_error 被定义为异常,并在最后的异常部分中列出(如下例所示),是否会跳过代码中的所有其他块并立即退出一个错误?谢谢你。
.
.
.
ELSIF SQLCODE = -12154 THEN
DBMS_OUTPUT.PUT_LINE('Detected a TNS error');
RAISE handle_tns_error;
ELSE
RAISE;
END IF;
END;
<all code here will be ignored>
EXCEPTION
WHEN handle_tns_error THEN
DBMS_OUTPUT.PUT_LINE('tns error detected');
:ret_code := 1;
WHEN OTHERS THEN RAISE;
END;
/
如果您引发异常,块末尾的处理程序将捕获它。如果块没有异常处理程序,它将由外部块处理,最后由客户端处理。
执行块中的引发应始终紧跟用户定义的异常或系统定义的异常,否则您将收到以下错误:
没有名称异常的引发应该在异常块内。
现在您问题的第二部分是关于用户定义的异常。在这种情况下,是的,所有其他代码都将被跳过,并且在编写此用户定义的异常处理程序代码时,控制权将传递给异常块。
抛出异常是一个两阶段的过程(这就是为什么将它用于“正常”程序流控制通常是不受欢迎的)。
所以是的,抛出当前块没有处理程序的异常将绕过当前块其余部分中的代码以及它可能具有的任何[其他]处理程序。