Question

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?

Was it helpful?

Solution

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.

OTHER TIPS

/* 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
*/
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top