2013-06-14 2 views
0

pl/sql에서 내부 시작, 끝 블록 및 "예외 기타"블록이 있습니다. 내부 블록에서 내 사용자 정의 예외를 throw 할 때 내부 "예외 기타"블록이 아니라 마지막 "예외 사용자 정의"블록에서이 예외를 catch하고 싶습니다. 아이디어가 있으십니까?oracle에서 사용자 정의 예외를 무시합니다.

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; 

하고 DIE_HORRIBLY 또는 DIE_EVEN_MORE_HORRIBLY보다는 DO_SOMETHING_REASONABLE 할 :이 같은 것을 가지고있는 것처럼

+3

왜'기타 OTHERS' 예외 처리기를 사용하고 있습니까? 왜 실제로 처리 할 수있는 특정 예외 만 잡으려고하지 않습니까? –

+0

시도한 코드를 게시 할 수 있습니까? 아마 당신의 문제를 더 잘 설명하는 데 도움이 될 것입니다. – FrustratedWithFormsDesigner

+0

@Justin, 저는 이미 문제를 해결할 방법을 알고 있습니다. 더 적은 코드로 가능한지 아닌지 궁금합니다. – mesut

답변

3

는 소리가 난다. 죄송합니다 - 귀하의 예외에 대한 내부 블록에 처리기를 제공하지 않으면 그렇게 할 수 없습니다. 다음과 같이해야합니다 :

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; 

공유하고 즐기십시오.

+0

당신은 그냥 안쪽 블록에서 예외를 잡아 다시 던지라고 ... 나는 그 해결책을 알고, 적은 코드로 가능할 지 궁금해 ... – mesut

+0

내부에서 가장 큰 블록의 코드가 던져진 상황을 감안할 때 사용자 정의 예외, 각각의 중첩 된 블록은'WHEN OTHERS' 핸들러를 가지며 외부 블록에서만 사용자 정의 예외를 처리하기를 원한다. 나는 이것을 수행하는 다른 방법을 생각할 수 없다. 내부 SQLCODE 값을 확인하고 다시 올릴 수있는 내부의'WHEN OTHERS' 핸들러에서 상상해 보았습니다. 그러나 나는 이것이 위에서 제안한 것보다 훨씬 더 낫다고 생각합니다. 기본적으로 "처리하고 싶지 않은 모든 오류 * 처리"처리기를 만드는 방법을 알 수 없습니다. 공유하고 즐기십시오. –

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 
*/ 
관련 문제