Domanda

In pl/sql I have some inner begin, end blocks and "Exception Others" blocks. When I throw my user defined exception from an inner block I just want to catch this exception in the last "Exception userdef" block, not in the inner "Exception Others" blocks. Any idea?

È stato utile?

Soluzione

It sounds like you have something like this:

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;

and you want to DO_SOMETHING_REASONABLE rather than DIE_HORRIBLY or DIE_EVEN_MORE_HORRIBLY. Sorry - you can't do that without providing a handler in the inner blocks for your exception. You'll have to do something like:

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;

Share and enjoy.

Altri suggerimenti

/* 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
*/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top