《PHP8上級試験対策》Error例外とExceptionの違いを徹底整理

  • URLをコピーしました!

はじめに

PHP7以降、エラーモデルが大きく刷新され、「致命的エラー(Fatal error)」などもオブジェクトとして扱われるようになりました。これにより、try...catch構文でエラーを補足できるようになりましたが、ErrorクラスとExceptionクラスの関係を正しく理解していないと混乱しがちです。
この記事では、Error例外とExceptionの違いを図解付きでわかりやすく整理します。

キーワード: Error例外 / Throwable / Exceptionとの違い / catch構文 / PHP7以降のエラーモデル

目次

🧱 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 を使えば、ErrorException の両方をキャッチできます。

try {
    // Error or Exception
} catch (Throwable $t) {
    echo "Caught anything: ", $t->getMessage();
}

📘 まとめ表

クラス名説明捕捉可能なcatch
Exception通常の例外(ユーザー定義や標準)catch(Exception $e)
ErrorPHPエンジンレベルの致命的エラー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 で両方補足可能ExceptionErrorの共通親
✅ 実行結果Error thrown!! any error

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次