2017-07-18 23 views
1

PL/SQLに複数のネストされたブロックがありますが、エラーが発生した場合は、それぞれのネストされたレベルでそれを投げます。内部ブロックの例外(RAISE)の例外を再スローするたびに、DBMS_UTILITY.FORMAT_ERROR_BACKTRACEは、例外が最後に発生したポイント(トップレベルへの途中のネストされたブロックの1つ)にスタックをリセットします。私は例外が最初に発生したポイントから完全なスタックトレースを取得する方法を見つけることができませんでした。中間ブロックで再スローする前にロギング以外の完全なスタックトレースを取得する方法はありますか?PL/SQLで再スローされた例外のスタックトレースを取得する(例外の発生元から)

+0

例外をキャッチして再スローすると、エラースタックが再度発生したポイントまでエラースタックがリセットされます。最初に例外をマスクしているのは、内側のブロックで例外が処理されなかった場合、正しいエラーと元の行でトップレベルまで次のレベル/外側のブロックに自動的に伝播されます。 – ivanzg

+0

中間ブロックでの例外のロギング。 – fg78nc

+1

もう一度、中間ブロックでエラーを処理してそれを捕まえて再発生させない場合のポイントは何ですか?例外は、中間ブロックを介して処理できる最上位レベルまで自動的に伝播されます。 – ivanzg

答えて

1

私はあなたに何をしようとしているのか分かりますが、これは必要ないということに同意します。トップレベルのハンドラでは、呼び出されたスタック全体をプログラムの行とエラー行にバックトレースできます。

RAISEステートメントは、あなたがやっていることに対するキラーです。すぐに実際のエラー位置を失いました。

0

実際には、コール・スタック全体を取得するには、DBMS_UTILITY.FORMAT_CALL_STACK()とDBMS_UTILITY.FORMAT_ERROR_BACKTRACE()の組み合わせを使用します。 FORMAT_CALL_STACKはエラーハンドラまでのトップレベルコールを表示し、FORMAT_ERROR_BACKTRACEはエラーハンドラからエラープロシージャとコード行まで(正確に)表示します。

FORMAT_CALL_STACKの唯一の欠点は、行番号が必ずしも期待通りではなく、エラーハンドラを指していることです。

関連する問題