はじめに
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 |