🐘

【PHP】例外の捕捉catch

に公開

1. 概要

PHPのtry、catchを記述する際、catchを無意識に設定していましたが、catchの種類をしっかり設定してあげないと捕捉してくれないということを改めて意識したので、以下に記述します。

2. try-catchとは

プログラム実行中に予期しないエラーが発生した場合(例えば、データベースに接続できない、ファイルが見つからないなど)、プログラムは通常の実行フローを中断し、エラー処理コードに移行します。
try-catchブロックは、例外を「捕捉」して適切に処理するために使用されます。tryブロック内に例外が発生する可能性のあるコードを記述し、catchブロック内でその例外をどのように処理するか記述することで、プログラムを意図して動かすようにすることができるようになります。

3. try-catchで扱える例外処理の種類

PHPのtry-catchで扱える例外処理にはいくつかの種類があります。基本的にはExceptionクラスをベースとした例外オブジェクトをキャッチしますが、PHPには多くの組み込み例外があり、用途に応じて使い分けることができます。以下は主な例外処理の種類です。
※適切な例外処理を設定してあげないと、catchしてもらえず、そのまま例外が発生するので、適切に設定してあげましょう

3-1. Exception

PHPの標準的な例外クラスです。カスタム例外を作成する場合も、通常はこのクラスを拡張します。

try {
    // 例外が発生する可能性のあるコード
    
} catch (Exception $e) {
    echo "エラーメッセージ: " . $e->getMessage();
}

3-2. ErrorException

PHPのエラー(E_NOTICE, E_WARNING, E_ERRORなど)を例外として扱うためのクラスです。(set_error_handlerでカスタマイズすることが多い)

try {
    // 例外が発生する可能性のあるコード
    
} catch (ErrorException $e) {
    echo "キャッチしたエラー: " . $e->getMessage();
}

3-3. LogicException

ロジックのエラーを扱うための例外クラスです。
プログラムのロジックに問題がある場合に使います。InvalidArgumentExceptionやDomainExceptionなどがこれを継承します。

try {
    // 例外が発生する可能性のあるコード
    
} catch (LogicException $e) {
    echo "ロジックエラーメッセージ: " . $e->getMessage();
}

3-4. RuntimeException

実行時に発生するエラーを扱います。プログラムの実行中にのみ検知できる問題を扱います。OutOfBoundsExceptionやUnexpectedValueExceptionなどがこれを継承します。

try {
    // 例外が発生する可能性のあるコード
    
} catch (RuntimeException $e) {
    echo "実行時エラー: " . $e->getMessage();
}

3-5. TypeError

型に関連するエラーを扱います。例えば、関数に間違った型の引数を渡したときなどにスローされます。

function test(int $num) {
    return $num;
}

try {
    test("string"); // 型が違うためエラー
} catch (TypeError $e) {
    echo "型エラー: " . $e->getMessage();
}

3-6. DivisionByZeroError

数値をゼロで割ろうとしたときに発生するエラーです。

try {
    $result = 10 / 0;
} catch (DivisionByZeroError $e) {
    echo "ゼロ除算エラー: " . $e->getMessage();
}

3-7. Error

PHP 7以降、Errorクラスが導入され、致命的なエラーをキャッチすることができるようになりました。通常のExceptionとは異なり、PHPのエンジンが投げるエラーを扱います。

try {
    // 例外が発生する可能性のあるコード
    
} catch (Error $e) {
    echo "エラー: " . $e->getMessage();
}

3-8. PDOException

PDOException クラスは、PDOによるデータベース接続やクエリ実行時に発生するエラーを扱います。

// データベース接続エラー
try {
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 例外モードを有効にする
} catch (PDOException $e) {
    echo "データベース接続エラー: " . $e->getMessage();
}

// クエリエラー
try {
    $stmt = $pdo->prepare("SELECT * FROM non_existing_table");
    $stmt->execute();
} catch (PDOException $e) {
    echo "クエリエラー: " . $e->getMessage();
}

3-9. Custom Exception

独自の例外クラスを作成して、特定のエラーを扱うことも可能です。Exceptionクラスや他の例外クラスを継承して作成します。

class MyCustomException extends Exception {}

try {
    throw new MyCustomException("カスタム例外が発生しました。");
} catch (MyCustomException $e) {
    echo "カスタム例外: " . $e->getMessage();
}

4. 参考記事

Discussion