2011-08-09 3 views

答えて

5
DECLARE 
    pe_ratio NUMBER(3,1); 
BEGIN 
    SELECT price/earnings INTO pe_ratio FROM stocks 
     WHERE symbol = 'XYZ'; -- might cause division-by-zero error 
    INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio); 
    COMMIT; 
EXCEPTION -- exception handlers begin 
    WHEN ZERO_DIVIDE THEN -- handles 'division by zero' error 
     INSERT INTO stats (symbol, ratio) VALUES ('XYZ', NULL); 
     COMMIT; 
    RAISE ; --This will reraise your exception 
END; -- exception handlers and block end here 

私が正しくあなたの質問を理解していれば、あなたはちょうどあなたがそれをキャプチャしたら、例外をre-raiseする必要があります。 (例外ブロックに上記参照; hereの例に基づいて)上記のリンクから


EDIT


http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm#1069

任意OTHERS例外ハンドラ、そのブロックまたはサブプログラム内の最後の ハンドラであり、 excのハンドラとして機能します。特定の名前は付けられません。したがって、ブロックまたはサブプログラムは、OTHERSハンドラを1つだけ持つことができます。

EXCEPTION 
    WHEN ZERO_DIVIDE THEN 
     -- handle the error 
    WHEN NO_DATA_FOUND THEN 
     -- handle the error 
    WHEN OTHERS THEN 
     -- handle all other errors 
END; 

WHEN OTHERS 
NULL ; --swallowing the exception, not propagating it, just ignoring it. This will be problematic! 
END ; 

しかし、あなたを...たとえば、あなたがエラーを飲み込むと、何も

しないようにWHEN OTHERSの使用を避ける必要があり、OTHERSを使用しての注意事項がありますこれを行うことができます:

WHEN OTHERS 
    LOGException(...) ; /** look at the asktom link for his example **/ 
    RAISE; --always follow up with a RAISE! 
END ; 

Have a look at asktom to see his views WHEN OTHERS

ただし、呼び出し元のアプリケーションに例外を伝播させたい場合は、キャプチャする必要はありません。それをキャプチャしないで、自動的にそれはバブルアップします。

+0

特定の例外ではなく、すべてをキャプチャするのはどうですか? – Malfist

+0

すべての例外をキャプチャするために編集しました。 – Malfist

+0

@Malfist、 'catch all'は他にもあります(上記の編集を行いました) – Harrison

関連する問題