这是我经常被问到的问题。由于我在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;
但是,我应该使用什么命令来忽略一个或所有引发的异常,并将执行控制权返回给调用块?
发布于 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;
发布于 2017-04-26 22:21:15
另一种情况是,悄悄忽略异常是有意义的:当您调用一个脚本时,如果该对象不存在,并且您没有该对象的创建或替换语法,则该脚本应创建该对象。PLSQL对象有create-or-replace语法,但表和索引没有。然后,我们可以将这些脚本放在一个块中,并忽略引发的异常。
https://stackoverflow.com/questions/27566867
复制相似问题