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日

