首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PL/SQL异常处理:不执行任何操作(忽略异常)

PL/SQL异常处理:不执行任何操作(忽略异常)
EN

Stack Overflow用户
提问于 2014-12-19 21:11:11
回答 2查看 77.7K关注 0票数 40

这是我经常被问到的问题。由于我在stackoverflow上找不到任何完全相同的副本,我想我应该把它作为参考。

问:在PL/SQL中,我知道如何捕获异常并在捕获时执行代码,以及如何将它们传播到调用块。例如,在下面的过程中,直接处理NO_DATA_FOUND异常,而向调用块引发所有其他异常:

CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
IS
BEGIN
    do_stuff();

EXCEPTION
    WHEN NO_DATA_FOUND THEN
        -- Do something
        handle_exception();

    WHEN OTHERS THEN
        -- Propagate exception
        RAISE;
END;

但是,我应该使用什么命令来忽略一个或所有引发的异常,并将执行控制权返回给调用块?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-19 21:11:11

虽然我同意99%的情况下默默地忽略异常而不将其记录在某个地方是一种糟糕的做法,但在某些特定情况下,这是完全可以接受的。

在这些情况下,NULL是您的朋友:

[...]
EXCEPTION

    WHEN OTHERS THEN
        NULL;
END;

可能需要忽略异常的两种典型情况是:

1)您的代码包含一条语句,您知道它偶尔会失败,并且您不希望这一事实中断您的程序流。在这种情况下,应将语句包含在嵌套块中,如下例所示:

CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
IS
    l_empoyee_name  EMPLOYEES.EMPLOYEE_NAME%TYPE;
BEGIN
    -- Catch potential NO_DATA_FOUND exception and continue
    BEGIN 
        SELECT EMPLOYEE_NAME
        INTO l_empoyee_name
        FROM EMPLOYEES
        WHERE EMPLOYEE_ID = 12345;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            NULL;
        WHEN OTHERS THEN
            RAISE;
    END;

    do_stuff();

EXCEPTION

    WHEN OTHERS THEN
        -- Propagate exception
        RAISE;
END;

请注意,PL/SQL通常不允许Visual Basic中已知的On Error Resume下一种类型的异常处理,在这种情况下,所有异常都被忽略,程序继续运行,就好像什么都没有发生一样(请参见On error resume next type of error handling in PL/SQL oracle)。您需要显式地将可能失败的语句包含在嵌套块中。

2)你的过程是如此的不重要以至于忽略它抛出的所有异常都不会影响你的主程序逻辑。(然而,这种情况很少发生,而且从长远来看,经常会导致调试噩梦)

BEGIN

    do_stuff();

EXCEPTION

    WHEN OTHERS THEN
        -- Ignore all exceptions and return control to calling block
        NULL;
END;
票数 62
EN

Stack Overflow用户

发布于 2017-04-26 22:21:15

另一种情况是,悄悄忽略异常是有意义的:当您调用一个脚本时,如果该对象不存在,并且您没有该对象的创建或替换语法,则该脚本应创建该对象。PLSQL对象有create-or-replace语法,但表和索引没有。然后,我们可以将这些脚本放在一个块中,并忽略引发的异常。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27566867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档