基礎

PHPの例外処理入門|try-catch文の使い方

例外処理は、プログラム実行中に発生するエラー(例外)をキャッチして適切に処理する仕組みです。try-catch文を使うことで、エラーが発生してもプログラムを安全に続行できます。

基本的な使い方

構文
try {
    // 例外が発生する可能性のある処理
} catch (Exception $e) {
    // 例外が発生した場合の処理
} finally {
    // 例外の有無に関わらず必ず実行される処理
}
PHP
<?php
function divide(int $a, int $b): float {
    if ($b === 0) {
        throw new Exception("0で割ることはできません");
    }
    return $a / $b;
}

try {
    echo divide(10, 2) . "<br>";   // 5
    echo divide(10, 0) . "<br>";   // 例外が発生
    echo "この行は実行されない<br>";
} catch (Exception $e) {
    echo "エラー: " . $e->getMessage() . "<br>";
} finally {
    echo "処理完了<br>";
}
?>
実行結果
5
エラー: 0で割ることはできません
処理完了

複数の例外をキャッチ

PHP
<?php
try {
    $file = fopen("nonexistent.txt", "r");
    if ($file === false) {
        throw new RuntimeException("ファイルが開けません");
    }
} catch (InvalidArgumentException $e) {
    echo "引数エラー: " . $e->getMessage();
} catch (RuntimeException $e) {
    echo "実行時エラー: " . $e->getMessage();
} catch (Exception $e) {
    echo "その他のエラー: " . $e->getMessage();
}
?>

具体的な例外クラスから順にキャッチします。Exceptionは全ての例外の親クラスなので、最後に配置します。

カスタム例外クラス

PHP
<?php
class ValidationException extends RuntimeException {
    private array $errors;
    
    public function __construct(array $errors) {
        $this->errors = $errors;
        parent::__construct("バリデーションエラー");
    }
    
    public function getErrors(): array {
        return $this->errors;
    }
}

try {
    $age = -5;
    if ($age < 0) {
        throw new ValidationException(["age" => "年齢は0以上にしてください"]);
    }
} catch (ValidationException $e) {
    foreach ($e->getErrors() as $field => $message) {
        echo "{$field}: {$message}<br>";
    }
}
?>
例外を使うべき場面

例外は「異常事態」に使います。ファイルが見つからない、DBに接続できない、APIがエラーを返したなど、プログラムが正常に処理を続行できない場合にthrowします。

例外を握りつぶさない

catchブロックで何もせず例外を無視する(握りつぶす)と、バグの原因が隠蔽されます。最低限ログに記録するか、適切なエラーメッセージを表示しましょう。

まとめ

  • try-catchで例外をキャッチし、エラーを安全に処理できる
  • throwで例外を発生させ、finallyで後処理を行う
  • 複数のcatchブロックで例外の種類ごとに処理を分けられる
  • カスタム例外クラスでドメイン固有のエラーを表現できる