例外処理
例外の種類
- 事前定義例外: ORACLEが事前に定義している一般的なエラー(例: ZERO_DIVIDE, NO_DATA_FOUND)
- ユーザー定義例外: 開発者が独自に定義するエラー
例外ハンドラ
DECLARE
v_number NUMBER;
BEGIN
v_number := 1 / 0; -- ここで例外が発生
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Division by zero error!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM);
END;
RAISE文
RAISE文は、PL/SQLのプログラム内で明示的に例外を発生させるために使用されます。RAISE文を使用することで、カスタム例外を発生させたり、事前定義された例外を再度発生させたりすることができます。
RAISE文の使い方
-
カスタム例外の発生
- カスタム例外を宣言し、特定の条件が満たされたときにその例外を発生させます。
-
事前定義された例外の再発生
- 例外処理ブロック内で捕捉された例外を再度発生させることができます。
カスタム例外の発生
以下の例では、負の値が入力された場合にカスタム例外を発生させます。
DECLARE
v_number NUMBER := -1; -- 負の値を初期化
e_negative_number EXCEPTION; -- カスタム例外を宣言
BEGIN
-- 負の値が入力された場合にカスタム例外を発生させる
IF v_number < 0 THEN
RAISE e_negative_number;
END IF;
EXCEPTION
-- カスタム例外を処理する
WHEN e_negative_number THEN
DBMS_OUTPUT.PUT_LINE('Error: Negative number is not allowed.');
END;
事前定義された例外の再発生
以下の例では、事前定義された例外を捕捉し、再度発生させます。
DECLARE
v_number NUMBER := 10;
v_result NUMBER;
BEGIN
BEGIN
-- 0による除算を試みる
v_result := v_number / 0;
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Caught an exception: Division by zero.');
RAISE; -- 例外を再度発生させる
END;
EXCEPTION
-- 再度発生した例外を処理する
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Re-raised exception: Division by zero.');
END;
RAISE_APPLICATION_ERRORプロシージャ
RAISE_APPLICATION_ERRORプロシージャは、ユーザー定義のエラーメッセージを生成するために使用されます。このプロシージャを使用すると、特定のエラー番号とメッセージを指定して例外を発生させることができます。
例: RAISE_APPLICATION_ERRORの使用
DECLARE
v_number NUMBER := -1;
BEGIN
-- 負の値が入力された場合にユーザー定義の例外を発生させる
IF v_number < 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Negative number is not allowed.');
END IF;
EXCEPTION
-- ユーザー定義の例外を処理する
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
ベストプラクティス
- 例外処理は簡潔に、エラーの特定と対応を明確に行う。
- 不要な例外処理を避け、必要な部分にのみ例外ハンドラを設ける。