PHPの例外処理(Exception, throw, try, catch, finally)

PHPの例外処理(Exception, throw, try, catch, finally)

例外とは何か?

PHPでは、プログラムの実行中にエラーが発生した場合、通常のエラーメッセージの他に「例外(Exception)」を使ってエラー処理を行うことができます。

例外を使うことで、エラーが発生してもプログラムを適切に処理し、異常終了を防ぐことができます。

try…catch の基本

PHPの例外処理は、try ブロックと catch ブロックを使って記述します。


try {
    // 例外を発生させる可能性のあるコード
} catch (Exception $e) {
    // 例外が発生した場合の処理
}

例えば、ゼロ除算のエラーをキャッチする例を見てみましょう。


try {
    $a = 10;
    $b = 0;
    if ($b === 0) {
        throw new Exception("ゼロで割ることはできません");
    }
    echo $a / $b;
} catch (Exception $e) {
    echo "エラー: " . $e->getMessage();
}

throw で例外を発生させる

例外を発生させるには throw を使います。


throw new Exception("エラーメッセージ");

次のコードでは、負の数が入力された場合に例外を発生させます。


function checkNumber($number) {
    if ($number < 0) {
        throw new Exception("負の数は許可されていません: " . $number);
    }
    return "OK";
}

try {
    echo checkNumber(-5);
} catch (Exception $e) {
    echo "エラー: " . $e->getMessage();
}

finally の使い方

finally ブロックを使うと、例外の有無にかかわらず実行されるコードを指定できます。


try {
    throw new Exception("エラー発生");
} catch (Exception $e) {
    echo "例外をキャッチ: " . $e->getMessage();
} finally {
    echo "必ず実行される処理";
}

Exception クラスの詳細

PHPの Exception クラスには、いくつかの便利なメソッドがあります。

  • getMessage(): 例外のメッセージを取得
  • getCode(): 例外のコードを取得
  • getFile(): 例外が発生したファイルを取得
  • getLine(): 例外が発生した行番号を取得

例:


try {
    throw new Exception("カスタムエラーメッセージ", 100);
} catch (Exception $e) {
    echo "メッセージ: " . $e->getMessage();
    echo "コード: " . $e->getCode();
    echo "ファイル: " . $e->getFile();
    echo "行: " . $e->getLine();
}

カスタム例外クラスの作成

PHPでは独自の例外クラスを作成できます。


class MyException extends Exception {}

try {
    throw new MyException("カスタム例外発生");
} catch (MyException $e) {
    echo "カスタム例外キャッチ: " . $e->getMessage();
}

ネストした例外処理

例外の中でさらに例外をスローすることもできます。


try {
    try {
        throw new Exception("最初の例外");
    } catch (Exception $e) {
        echo "ネスト内キャッチ: " . $e->getMessage();
        throw new Exception("再スローされた例外");
    }
} catch (Exception $e) {
    echo "外部キャッチ: " . $e->getMessage();
}

複数の catch ブロック

異なる種類の例外をキャッチするには、複数の catch ブロックを使います。


class FirstException extends Exception {}
class SecondException extends Exception {}

try {
    throw new FirstException("First Exception 発生");
} catch (FirstException $e) {
    echo "FirstException をキャッチ: " . $e->getMessage();
} catch (SecondException $e) {
    echo "SecondException をキャッチ: " . $e->getMessage();
}

例外の再スロー(rethrow)

catch ブロック内で例外を再スローできます。


try {
    try {
        throw new Exception("元の例外");
    } catch (Exception $e) {
        echo "キャッチ: " . $e->getMessage();
        throw $e; // 再スロー
    }
} catch (Exception $e) {
    echo "再スローされた例外をキャッチ: " . $e->getMessage();
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です