(PHP 5, PHP 7, PHP 8)
set_exception_handler — ユーザー定義の例外ハンドラ関数を設定する
例外が try/catch ブロックの中でキャッチされなかった場合の
デフォルトの例外ハンドラを設定します。
実行は、callback がコールされた後に
停止します。
注意:
例外ハンドラの実行中は、有効な例外ハンドラが存在しない状態になります。 PHP 8.3.0 以降のエンジンは、ハンドラがスローした例外が再びそのハンドラに 渡されないよう、ハンドラを呼び出す前にその設定を解除するからです。 そのため、ハンドラの中から set_exception_handler() を コールすると、前に定義されたハンドラは存在しないと報告されます。
さらに PHP 8.3.5 以降のエンジンは、呼び出そうとしているハンドラを ハンドラスタックにプッシュします。 そのため、ハンドラの中から restore_exception_handler() を コールすると、その前に有効だったハンドラではなく、 現在実行中のハンドラが再度設定されます。
実行中のハンドラは、リターンする際に自動的に再度設定されます。 ただし、その時点で有効な例外ハンドラが存在しない場合に限ります。 ハンドラが set_exception_handler() または restore_exception_handler() をコールした時点で、 この自動的な復元は行われなくなり、 ハンドラ自身が設定したままのハンドラが有効になります。
したがって、例外ハンドラの中から例外ハンドラを変更することは推奨されません。
| バージョン | 説明 |
|---|---|
| 8.3.5 | 呼び出される例外ハンドラがハンドラスタックにプッシュされ、 リターンした時点で再度設定されるようになりました。 ただし、ハンドラ自身がスタックを変更した場合は除きます。 |
| 8.3.0 | 有効な例外ハンドラが、実行中は設定解除されるようになりました。 そのため、ハンドラの中から set_exception_handler() を コールすると、前に定義されたハンドラは存在しないと報告されます。 |
例1 set_exception_handler() の例
<?php
function exception_handler(Throwable $exception) {
echo "Uncaught exception: " , $exception->getMessage(), "\n";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Not Executed\n";
?>