如果第一个语句引发异常,是不是会执行以下语句?
Posted
技术标签:
【中文标题】如果第一个语句引发异常,是不是会执行以下语句?【英文标题】:Are following statements executed in any case if the first one throws an exception?如果第一个语句引发异常,是否会执行以下语句? 【发布时间】:2018-11-19 16:47:12 【问题描述】:当第一个 select 语句发生异常时。在任何情况下都会执行第二个 select 语句和函数吗?还是会跳过以下所有语句?
BEGIN
SELECT ...
SELECT ...
procedure_that_performs_select();
EXCEPTION
WHEN NO_DATA_FOUND THEN ...
END
【问题讨论】:
【参考方案1】:在PLSQL
中,发生异常会在异常点停止程序执行并跳转到EXCEPTION
块(如果有)进行处理,否则将向客户端引发异常。
您可以在测试块中看到此行为。 这里我们将打印异常前后,可以观察异常没有打印后的下一条语句:
BEGIN
DBMS_OUTPUT.PUT_LINE('About to throw an exception');
RAISE_APPLICATION_ERROR(-20001,'Exception');
DBMS_OUTPUT.PUT_LINE('Done throwing exception');
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Handling the exception');
END;
/
结果:
About to throw an exception
Handling the exception
注意:在您提供的示例中,EXCEPTION
块仅处理 NO DATA FOUND
异常,因此将引发其他类型的异常,而不是通过异常处理程序运行。但无论如何,事情都会在异常发生时停止处理。
【讨论】:
【参考方案2】:一旦控件进入异常块,它就不会返回到 pl/sql 块的开始或声明部分。 同样,如果您的第一个 select 语句中有错误,则会执行异常块并使用相应的处理程序。如果您既没有提及相应的处理程序,也没有提及 WHEN OTHERS,则控件将转到调用环境(任何过程或接口/IDE)。
如果您仍然希望运行第二个 select 语句,您可以在异常处理程序中编写另一个 pl/sql 块。
【讨论】:
以上是关于如果第一个语句引发异常,是不是会执行以下语句?的主要内容,如果未能解决你的问题,请参考以下文章