【问题标题】:ignore a user defined exception in oracle在 oracle 中忽略用户定义的异常
【发布时间】:2013-06-11 03:08:29
【问题描述】:

在 pl/sql 中,我有一些内部开始、结束块和“异常其他”块。 当我从内部块中抛出用户定义的异常时,我只想在最后一个“Exception userdef”块中捕获这个异常,而不是在内部的“Exception Others”块中。 有什么想法吗?

【问题讨论】:

  • 为什么要使用WHEN OTHERS 异常处理程序?为什么不只捕获您实际可以处理的特定异常?
  • 你能贴出你试过的代码吗?它可能有助于更好地解释您的问题。
  • @Justin,我已经知道一些解决问题的方法。我只是想知道是否可以使用更少的代码。

标签: oracle exception plsql defined


【解决方案1】:

听起来你有这样的东西:

BEGIN
  BEGIN
    BEGIN
      DO_SOMETHING;  -- raises USERDEF_EXCEPTION 
    EXCEPTION
      WHEN OTHERS THEN
        DIE_HORRIBLY;
    END;
  EXCEPTION
    WHEN OTHERS THEN
      DIE_EVEN_MORE_HORRIBLY;
  END;
EXCEPTION
  WHEN USERDEF_EXCEPTION THEN
    DO_SOMETHING_REASONABLE;
  WHEN OTHERS THEN
    DIE_INCREDIBLY_HORRIBLY;
END;

并且您想要 DO_SOMETHING_REASONABLE 而不是 DIE_HORRIBLY 或 DIE_EVEN_MORE_HORRIBLY。抱歉 - 如果不在内部块中为您的异常提供处理程序,您将无法做到这一点。您必须执行以下操作:

BEGIN
  BEGIN
    BEGIN
      DO_SOMETHING;  -- raises USERDEF_EXCEPTION 
    EXCEPTION
      WHEN USERDEF_EXCEPTION THEN
        RAISE;
      WHEN OTHERS THEN
        DIE_HORRIBLY;
    END;
  EXCEPTION
    WHEN USERDEF_EXCEPTION THEN
      RAISE;
    WHEN OTHERS THEN
      DIE_EVEN_MORE_HORRIBLY;
  END;
EXCEPTION
  WHEN USERDEF_EXCEPTION THEN
    DO_SOMETHING_REASONABLE;
  WHEN OTHERS THEN
    DIE_INCREDIBLY_HORRIBLY;
END;

分享和享受。

【讨论】:

  • 你说只是在内部块中捕获异常并再次抛出......我知道那个解决方案,我想知道是否可以用更少的代码......
  • 鉴于您描述的情况,最内层块中的代码引发用户定义的异常,每个嵌套块都有一个 WHEN OTHERS 处理程序,您只想处理用户定义的异常在外部块中,我想不出另一种方法来做到这一点。我想在内部 WHEN OTHERS 处理程序中,您可以检查您的特定 SQLCODE 值并重新提高它,但我认为这比我上面建议的更重要。基本上,我不知道如何创建一个处理程序来“处理所有错误除了我不想处理的错误”。分享和享受。
【解决方案2】:
/* package */
CREATE OR REPLACE PACKAGE exceptions_pkg AS
    user_defined_exception EXCEPTION;
END exceptions_pkg;

/* block */
DECLARE
    l_var1 NUMBER;
BEGIN
    DBMS_OUTPUT.PUT_LINE('one');

    DECLARE
        l_var2 NUMBER;
    BEGIN
        DBMS_OUTPUT.PUT_LINE('two');

        IF 1 < 2 THEN
            RAISE exceptions_pkg.user_defined_exception;
        END IF;

        DBMS_OUTPUT.PUT_LINE('three');
    END;

    DBMS_OUTPUT.PUT_LINE('four');
EXCEPTION
    WHEN exceptions_pkg.user_defined_exception THEN
        DBMS_OUTPUT.PUT_LINE('five');
END;

-- anonymous block completed
/*
one
two
five
*/

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多