如果第一个语句引发异常,是不是会执行以下语句?

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 块。

【讨论】:

以上是关于如果第一个语句引发异常,是不是会执行以下语句?的主要内容,如果未能解决你的问题,请参考以下文章

python的异常处理

try语句的使用

python学习_26(异常)

C++中,用throw抛出异常后,throw之后的语句是不是继续执行?

Python编程时的捕获异常

python3 异常处理