はじめに
PHP7以降、エラーモデルが大きく刷新され、「致命的エラー(Fatal error)」などもオブジェクトとして扱われるようになりました。これにより、try...catch構文でエラーを補足できるようになりましたが、ErrorクラスとExceptionクラスの関係を正しく理解していないと混乱しがちです。
この記事では、Error例外とExceptionの違いを図解付きでわかりやすく整理します。
目次
🧱 PHP7以降のエラーモデル
PHP7から、すべての「投げられるオブジェクト(throwable)」は Throwable インターフェイスを継承するようになりました。そしてそれを継承する2つの大きな系統がこちら👇
Throwable
├── Exception(アプリケーションレベルの例外)
│ └── LogicException, RuntimeException ...
└── Error(エンジンレベルのエラー)
└── TypeError, ParseError, ArithmeticError, AssertionError ...✅ Exception はユーザーコードで投げられる一般的な例外
✅ Error はPHPエンジン内部が検知した致命的エラー(型エラーなど)
⚡ 例題:ErrorはExceptionでcatchできる?
試験でよく出る混乱ポイントです。次のコードを見てみましょう。
<?php
declare(strict_types=1);
error_reporting(-1);
try {
throw new Error("any error");
} catch (Exception $e) {
echo "Exception thrown!! \n";
echo $e->getMessage(), "\n";
} catch (Error $e) {
echo "Error thrown!! \n";
echo $e->getMessage(), "\n";
}🧩 実行結果
Error thrown!!
any error🔍 なぜこうなるのか?
Error クラスは Exception を継承していません。したがって、catch (Exception $e) では捕捉できず、catch (Error $e) でのみ捕捉されます。
❌ よくある誤り
error(Error $e) {
// ❌ PHP構文として存在しない
}PHPには error という句は存在せず、必ず catch を使います。
🧠 すべてをまとめて捕まえるには?
Throwable を使えば、Error と Exception の両方をキャッチできます。
try {
// Error or Exception
} catch (Throwable $t) {
echo "Caught anything: ", $t->getMessage();
}📘 まとめ表
| クラス名 | 説明 | 捕捉可能なcatch |
|---|---|---|
Exception | 通常の例外(ユーザー定義や標準) | catch(Exception $e) |
Error | PHPエンジンレベルの致命的エラー | catch(Error $e) |
Throwable | 上記2系統の共通インターフェイス | catch(Throwable $t) |
🧩 ASCIIアート図解
+----------------+
| Throwable |
+----------------+
/ \
/ \
+----------------+ +----------------+
| Exception | | Error |
+----------------+ +----------------+
| |
| |
LogicException TypeError, ParseError ...
RuntimeException🏁 まとめ
| ポイント | 内容 |
|---|---|
❌ error(Error $e) は存在しない | PHP構文エラーになる |
✅ catch (Error $e) が正しい | PHP7以降でサポート |
✅ Throwable で両方補足可能 | Exception+Errorの共通親 |
| ✅ 実行結果 | Error thrown!! any error |
