「例外処理、なんとなく try-catch で囲って終わり…」
「全部 Exception クラスを使っちゃってるけど、これっていいの?」
PHPを勉強し始めて少し経つと、こんな悩みが出てきませんか? 実は、僕も最初はそうでした。
でも、「例外の型(種類)」 を適切に使い分けるだけで、コードの品質がグッと上がり、バグの原因究明が驚くほど早くなるんです。
今回は、PHPの標準例外(SPL)の中でも特に重要な LogicException、DomainException、RuntimeException の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 で捕まえて「ただいま混み合っております」のようなエラー画面を出してあげる必要があります
まとめ
-
Logic / Domain 系
-
意味:「コードのバグ」
-
対応:コードを修正する(Catchして無視しちゃダメ!)
-
-
Runtime 系
-
意味:「実行時のトラブル」
-
対応:エラー画面を出したり、ログに残したりして運用でカバーする
-
この意識を持つだけで、「エラーが起きたときに何をすればいいか」が一瞬でわかるようになります。 ぜひ、明日からのコーディングで意識してみてくださいね!


