PHP 7.0以降の例外(Exception)とエラー(Error)を実験

PHP 7.0以降では例外(Exception)とエラー(Error)が明確に分類されていることを実際に実験して確認してみました。

実験環境:

$ php -v
PHP 8.3.6 (cli) (built: May 25 2026 13:12:06) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies

Exception の手動スロー

Exception を throw しているので、当然 Exception で catch している。

function getException() {
    try {
        $value = 0;
        if ($value == 0) {
            throw new Exception('例外手動スロー: ゼロによる除算です。');
        }
        echo 10 % $value;
    }
    catch (Error $e) {
        echo "エラー: " . $e->getMessage() . PHP_EOL;
    }
    catch (Exception $e) {
        echo "例外: " . $e->getMessage() . PHP_EOL;
    }
}

echo getException();

結果:

$ php exception.php 
例外: 例外手動スロー: ゼロによる除算です。

アサーション

assert は Error として catch している。 つまり AssertionError は、Error に分類される。

function getException() {
    try {
        $value = 0;
        //アサーション
        assert($value != 0, "アサーション: ゼロによる除算です。");
        echo 10 % $value;
    }
    catch (Error $e) {
        echo "エラー: " . $e->getMessage() . PHP_EOL;
    }
    catch (Exception $e) {
        echo "例外: " . $e->getMessage() . PHP_EOL;
    }
}

echo getException();
?>

結果:

$ php exception.php 
エラー: アサーション: ゼロによる除算です。

ゼロ除算の自動スロー

ゼロ除算の自動 throw は Error として catch している。 つまり DivisionByZeroError は、Error に分類される。

function getException() {
    try {
        $value = 0;
        echo 10 % $value;
    }
    catch (Error $e) {
        echo "エラー: " . $e->getMessage() . PHP_EOL;
    }
    catch (Exception $e) {
        echo "例外: " . $e->getMessage() . PHP_EOL;
    }
}

echo getException();
?>

結果:

$ php exception.php 
エラー: Modulo by zero

補足

Exception と Error クラス

PHP 7.0以降、Throwable インターフェースが新たに追加され、その配下に Exception と Error が定義されています。 このため、Throwable では Exception と Error の両方を catch できます。

    catch (Throwable $e) {
        echo "例外/エラー: " . $e->getMessage() . PHP_EOL;
    }

PHP5との比較

PHP5では Error は catch できず、ゼロ除算エラーなどは例外に変換しなければ catch できなかった。 また、assert() はコールバック関数を呼び出すだけで、そのままでは Exception として catch できなかった。

公開日:2026年07月05日
最終更新日:2026年07月05日

PHP言語の記事一覧

他の記事も見る

このページのトップに戻る