例外ハンドラは、呼び出された例外(ランタイム・エラーまたは警告状態)を処理します。 例外は、事前定義の例外またはユーザー定義の例外のいずれかです。 事前定義の例外は、実行時システムによって暗黙的(自動的)に呼び出されます。ユーザー定義の例外は、RAISE
文またはDBMS_STANDARD
.RAISE_APPLICATION_ERROR
プロシージャを使用して明示的に呼び出す必要があります。 後者を使用すると、ユーザー定義の例外にエラー・メッセージを関連付けることができます。
構文
exception_handler ::=
キーワードとパラメータの説明
exception_name
事前定義の例外(ZERO_DIVIDE
など)または現行の有効範囲内で事前に宣言されているユーザー定義の例外の名前です。
ブロックの例外処理部で明示的に名前を指定していないすべての例外を表します。 OTHERS
の使用はオプションで、ブロックの最後の例外ハンドラとしてのみ使用できます。 キーワードWHEN
に続く例外のリストの中では、OTHERS
を使用できません。
例外ハンドラの開始を知らせるキーワードです。 キーワードWHEN
に続けて、キーワードOR
で区切った例外のリストを指定すると、複数の例外で一連の同一文を実行できます。 リスト中のいずれかの例外が呼び出されると、それに関連付けられた文が実行されます。
使用上の注意
例外宣言はブロック、サブプログラム、またはパッケージの宣言部でのみ使用できます。 例外の有効範囲の規則は変数と同じです。 ただし、変数とは異なり、例外をパラメータとしてサブプログラムに渡すことができません。
例外のいくつかはPL/SQLによって事前に定義されています。 これらの例外のリストは、表11-1を参照してください。 PL/SQLは、事前定義済の例外をパッケージSTANDARD
でグローバルに宣言しているため、ユーザーが宣言する必要はありません。
事前定義の例外を再宣言すると、ローカルな宣言がグローバルな宣言をオーバーライドするため、エラーが発生しやすくなります。 この場合は、ドット表記法を使用して、次のように事前定義の例外を指定する必要があります。
EXCEPTION WHEN invalid_number OR STANDARD.INVALID_NUMBER THEN ...
PL/SQLブロックの例外処理部はオプションです。 例外ハンドラはブロックの末尾に置く必要があります。 例外処理部はキーワードEXCEPTION
で始まります。 ブロックの例外処理部の終わりは、ブロックの終わりも示すキーワードEND
です。 例外ハンドラから参照できる変数は、カレント・ブロックから参照できる変数のみです。
例外は、処理の続行が不可能、あるいは望ましくないようなエラーが発生した場合にのみ呼び出します。 呼び出された例外に対応する例外ハンドラがカレント・ブロックに存在しない場合、例外は次の規則に従って伝播します。
カレント・ブロックの外側にブロックがある場合、例外はそのブロックに渡されます。 この場合、例外が渡されたブロックがカレント・ブロックになります。 呼び出された例外に対応するハンドラが見つからない場合は、この過程が繰り返されます。
カレント・ブロックの外側にブロックがない場合、「未処理例外」エラーがホスト環境に戻されます。
ブロックの例外処理部でアクティブになれる例外は一度に1つのみです。 このため、ハンドラの内側で例外が呼び出されると、カレント・ブロックの外側のブロックが、新しく呼び出された例外に対するハンドラを検索するための最初のブロックになります。 それ以降の例外の伝播は通常どおりに行われます。
関連トピック