【PHP】例外の種類を分けて投げる

  • 2019年12月16日
  • PHP

 例外処理は次のようにtryで囲われた部分の実行中にthrowされたExceptionクラスのインスタンスをcatchする処理のことを言います。

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('ゼロによる除算。');
    }
    return 1/$x;
}

try {
    echo inverse(5) . "\n"; // 0.2
    echo inverse(0) . "\n"; // この引数を渡した関数実行時点で例外が投げられる
} catch (Exception $e) {
    echo '捕捉した例外: ',  $e->getMessage(), "\n"; // 捕捉した例外: ゼロによる除算。
}

// 実行は継続される
echo "Hello World\n"; // Hello World

PHP: 例外(exceptions) – Manual
 私的にはexitとgotoの合いの子の印象です。どこかでキャッチされない限り、処理が止まります。どこかのキャッチされるところまで処理をぶった切って飛んでいきます。
 例外処理はおおよそそれ以上、現在の処理が続行できない場合にthrowされます。ファイルが見つからないので後に続くファイル操作の処理ができないとわかり、例外を投げて処理を打ち切る、というのは典型的な例です。例の0割り算の様に例外には様々なパターンがあります。new Exception($message)とあるように、基底例外クラスにメッセージだけ載せるのも一つの手ですが、例外の種類を分けるとそれだけで意味を持ち、分かる人にはもっとわかりやすくなります。
 例外の拡張でよくあるものにSPL(StandardPHPLibrary)を用いたものがあります。次のリンクから一覧が見られます。
PHP: 例外 – Manual
 いくつもありますが特に重要なのは次の二つです。
 PHP: LogicException – Manual
 PHP: RuntimeException – Manual
 LogicExceptionはロジック例外、要するにプログラマの実装で致命傷が起きていることを示します。ValueObjectの様なプログラマの実装を規定する処理において、プログラマがその規定から外れた時に投げたりするのが一例です(LogicExceptionの派生も全然あります。InvalidArgumentExceptionはLogicExceptionの継承でよく使える例外です)。これが投げられたときは素直にデバッグ、修正をしましょう。
 RuntimeExceptionは実行時にのみ起こる例外です。運悪く通信が断絶した時などプログラム外のインフラでどうしようもなくなった時に投げるのが良いです。FileNotFoundExceptionなんかはRuntimeExceptionの典型です。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG