私が書いているストアドプロシージャを持っています。何らかのタイプの例外で失敗した場合は、特定の方法で応答したいが、依然として例外を呼び出し側。オラクルはすべての例外を監視しますがキャプチャしないことを確認します
どうすればいいですか?
私が書いているストアドプロシージャを持っています。何らかのタイプの例外で失敗した場合は、特定の方法で応答したいが、依然として例外を呼び出し側。オラクルはすべての例外を監視しますがキャプチャしないことを確認します
どうすればいいですか?
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!
ただし、呼び出し元のアプリケーションに例外を伝播させたい場合は、キャプチャする必要はありません。それをキャプチャしないで、自動的にそれはバブルアップします。
特定の例外ではなく、すべてをキャプチャするのはどうですか? – Malfist
すべての例外をキャプチャするために編集しました。 – Malfist
@Malfist、 'catch all'は他にもあります(上記の編集を行いました) – Harrison