0

本番環境にあり、例外ブロックに一部を追加したいくつかの手順をテストしています。テスト環境でこれらの手順のコピーを作成しましたが、テストのために例外を発生させる必要があります。

手順を例外ブロックに入るための簡単な方法または最小限のコード変更で何ができますか?

othersすべての例外をキャッチしている例外ブロックにあるだけです。例えば:

DECLARE
   -- something
BEGIN
   -- I need some operation to do here which will make control go to exception
EXCEPTION
   WHEN others THEN
      -- handling error (Need to check these changes)
END;

例外が発生した場合に制御フローをテストする手順を作成しましたが、エラーが発生しました。コードは以下です

CREATE OR REPLACE Procedure Exception_Check
AS
BEGIN

  dbms_output.put_line('step 1..........');
  raise_application_error(-20111, 'Step 2...........');
  dbms_output.put_line('step 3..........');


EXCEPTION
WHEN OTHERS THEN
    dbms_output.put_line('step 4, In to the exception block..........');
  raise_application_error(-20112, 'Step 5........... In raising application error');
END;

私は何を間違っていますか?

4

2 に答える 2

4

まず、すべてを使用してキャッチすることEXCEPTION WHEN OTHERSは、必ずしもベスト プラクティスではありません。例外を処理する場合は、それをどうするかを正確に知っておく必要があります。OTHERS を使用してすべての Oracle 例外を適切に処理する能力があるとは考えにくいため、そうする場合は、おそらく、通知される場所にログを記録する必要があります。

例外の回避と処理に関するOracleのガイドラインから引用するには:

  • 可能であれば、OTHERS 例外ハンドラーを使用する代わりに、名前付き例外の例外ハンドラーを記述します。

    事前定義された例外の名前と原因を学びます。データベース操作によって、内部で定義された名前のない特定の例外が発生する可能性があることがわかっている場合は、名前を付けて、その例外専用の例外ハンドラーを記述できるようにします。

質問に答えるには、次のraise_application_error手順を使用して、コード内の任意の場所でエラーを発生させることができます。

RAISE_APPLICATION_ERROR (-20000, 'an exception');

ユーザー定義の例外は 20,000 から 20,999 の間のものであるため、この範囲の数値を使用してください。

例は次のとおりです。

begin

   raise_application_error(-20500, 'an exception occurred');

exception when others then
   do_something;
end;
/

独自の事前定義された例外を定義して、キャッチすることもできます。

declare
   my_exception EXCEPTION;
   PRAGMA EXCEPTION_INIT( my_exception, -20001 );
begin
   raise_application_error( -20001, 'an exception' );
exception when my_exception then
   do_something;
end;
于 2012-12-24T09:50:56.160 に答える