第二个“其他人失败时的例外”

Posted

技术标签:

【中文标题】第二个“其他人失败时的例外”【英文标题】:Second 'exception when others' fails 【发布时间】:2018-10-11 15:55:48 【问题描述】:

我正在尝试使用 EXCEPTION WHEN OTHERS 来捕获我尝试 DROP 的不存在的表,如下所示:

begin
execute immediate 'drop table X';
exception when others then null;
end;

如果表 x 存在并且我运行它,则该表被删除并且一切正常。如果我再次运行它,没有要删除的表,但是 EXCEPTION 会导致脚本顺利进行。到现在为止还挺好。

如果我多次尝试这样做,就会出现问题。

如果我运行此脚本来删除表 X 和 Y:

begin
execute immediate 'drop table X';
exception when others then null;

execute immediate 'drop table Y';
exception when others then null;
end;

我收到以下错误信息:

从第 1 行开始的错误命令 -

begin
execute immediate 'drop table X';
exception when others then null;

execute immediate 'drop table Y';
exception when others then null;
end;

错误报告 - ORA-06550:第 6 行,第 1 列: PLS-00103:在预期以下情况之一时遇到符号“例外”:

( begin case declare end exit for goto if loop mod null 当使用时,pragma raise 返回选择更新

end not pragma final 可实例化顺序覆盖静态 成员构造函数映射 06550. 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。 *行动:

我在这里缺少什么?如果我删除了第二个 EXCEPTION WHEN 语句,如果表 Y 不存在,则脚本将失败...我需要捕获此错误...

【问题讨论】:

不要使用“when others then null”,因为可能会发生其他异常。相反,捕获您期望的异常:***.com/a/1801453/103295 【参考方案1】:

我在这里找到了答案:

Two PLSQL statements with begin and end, run fine separately but not together?

显然我需要

begin
    begin
        some stuff
    end;
    begin
        some other stuff
    end;
end;

或者在两个内部块 END 之后各放一个 /;的……

【讨论】:

【参考方案2】:

exception when others then null; 适用于单个开始/结束块。在一个块中包含多个是不是真的有效。您可以通过单独捕获多个块来解决此问题。

begin
execute immediate 'drop table X';
exception when others then null;
end;
/

begin
execute immediate 'drop table Y';
exception when others then null;
end;
/

【讨论】:

谢谢。我试过了......我试过了 ;在第一个END之后,也。不高兴...从第 1 行开始的错误命令 - 开始执行立即“删除表 X”;当其他人为空时异常;结尾;开始执行立即“删除表 Y”;当其他人为空时异常;结尾;错误报告 - ORA-06550: line 5, column 1: PLS-00103: Encountered the symbol "BEGIN" 06550. 00000 - "line %s, column %s:\n%s" *原因:通常是 PL/SQL 编译错误。 *行动:

以上是关于第二个“其他人失败时的例外”的主要内容,如果未能解决你的问题,请参考以下文章

在第二个 setOnClickListener 代码中使用 address.getLatitude() 访问纬度和经度失败

CreateProcess 和 WaitForSingleObject 在两个 PDF 文件中的第二个失败

SQL 注入 - 如果第一个查询失败,则强制执行第二个查询

关于java中ArrayList的快速失败机制的漏洞——使用迭代器循环时删除倒数第二个元素不会报错

robotframework:appium切换webview后,在第一个页面操作成功,跳转到第二个页面后,执行命令失败

kdump启动失败