0

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

4

2 回答 2

3

听起来你有这样的事情:

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;

分享和享受。

于 2013-06-14T15:07:27.733 回答
0
/* 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
*/
于 2013-06-14T14:38:07.810 回答