ソフトウェアをリリースしました

かいふく という訪問介護の副業に特化した求人サイトを公開しています。

お近くの介護資格保有者にご紹介頂けると嬉しいです 👏

https://kai-fuku.com/

このサイトにはプロモーションが含まれます

「例外処理、なんとなく try-catch で囲って終わり…」

「全部 Exception クラスを使っちゃってるけど、これっていいの?」

PHPを勉強し始めて少し経つと、こんな悩みが出てきませんか? 実は、僕も最初はそうでした。

でも、「例外の型(種類)」 を適切に使い分けるだけで、コードの品質がグッと上がり、バグの原因究明が驚くほど早くなるんです。

今回は、PHPの標準例外(SPL)の中でも特に重要な LogicExceptionDomainExceptionRuntimeException の3つについて、「現場ではどう使い分けているのか」 を解説していきます!

なぜ使い分ける必要があるの?

結論から言うと、「誰のせいなのか」 をはっきりさせるためです。

エラーが起きたとき、それが「プログラマーのミス(バグ)」なのか、「運悪くサーバーが落ちた(環境要因)」のかによって、対応方法は変わりますよね?

  • バグなら → コードを修正しないといけない

  • 環境要因なら → リトライしたり、ユーザーに「混み合ってます」と伝えたりする

これをクラスの型で表現するために、使い分けが必要なんです。

LogicException(ロジック例外)

「これは開発者のミス! コードを直して!」

これは、「プログラムの論理がおかしい」ときに投げる例外です。 基本的に、本番環境でこれが出たらアウト。即修正案件です。

例えば、「APIキーをセットしていないのに、リクエストを送ろうとした」みたいなケースですね/p>


class ApiClient
{
    private ?string $apiKey = null;

    public function setApiKey(string $key): void
    {
        $this->apiKey = $key;
    }

    public function request(): void
    {
        if ($this->apiKey === null) {
            // 開発者がセットアップ手順を間違えているため、LogicException
            throw new \LogicException('API Keyが設定されていません。request()の前にsetApiKey()を呼んでください。');
        }

        // リクエスト処理...
    }
}

 

この例外が出たら、catch して握りつぶすのではなく、コード自体を直しましょう。

2. DomainException(ドメイン例外)

「そのデータ、仕様としてありえないよ!」

これは LogicException の親戚みたいなものです。 「ロジックは動くけど、渡されたデータがビジネスルール(仕様)としてありえない」場合に使います。

例えば、「信号機の色」を扱うクラスがあったとして、「紫」を指定されたら困りますよね?

class TrafficLight
{
    private const ALLOWED_COLORS = ['red', 'yellow', 'blue'];

    public function __construct(private string $color)
    {
        if (!in_array($color, self::ALLOWED_COLORS, true)) {
            // 定義外の値がコードから渡された!
            throw new \DomainException("色 '{$color}' は信号機に存在しません。");
        }
    }
}

 

ユーザーの入力ミスというよりは、「コード上で変な値を渡してしまった」ときに検知するためのものです。

3. RuntimeException(実行時例外)

「コードは合ってるけど、環境のせいで失敗しました…」

一番よく使うのがこれです。 コードは正しいけれど、「DBに繋がらない」「ファイルがない」「外部APIが落ちてる」 といった、実行時の状況(Runtime)によって起きるエラーです。

class ConfigLoader
{
    public function load(string $filePath): array
    {
        if (!file_exists($filePath)) {
            // パスは合ってるはずだけど、ファイルが消えてる(実行時の事情)
            throw new \RuntimeException("設定ファイルが見つかりません: {$filePath}");
        }
        
        // 読み込み処理...
    }
}

 

このエラーが出たときは、try-catch で捕まえて「ただいま混み合っております」のようなエラー画面を出してあげる必要があります

やんやん

プログラマーとしてLEMP環境に主に生息しており、DevOps 的な立ち回りをしながらご飯を食べている当ブログの管理人のやんやんと申します。
最近はTmux使うのを辞めました。

まとめ

  • Logic / Domain 系

    • 意味:「コードのバグ」

    • 対応:コードを修正する(Catchして無視しちゃダメ!)

  • Runtime 系

    • 意味:「実行時のトラブル」

    • 対応:エラー画面を出したり、ログに残したりして運用でカバーする

この意識を持つだけで、「エラーが起きたときに何をすればいいか」が一瞬でわかるようになります。 ぜひ、明日からのコーディングで意識してみてくださいね!

おすすめの記事