いくら例外を投げても無反応だったので、原因を徹底調査しました。
すると、catch
ブロックの中で未定義の関数が見つかり、
その場所でFatal error
が発生したものの、
finally
ブロックの処理がそのエラーの表示より優先され、
最後に表示されるはずだったのにfinally
ブロックにあるdie()
のせいでエラー表示が消されてしまっていました。
私の環境
●Windows 10
●PHP 8.3.10(8.2.12 でも同様の現象を確認)
まずは、下記のスクリプトを実行してみてください。
<?php
// "Fatal error" の発生に気づけないことがあるかもしれません。
try{
throw new Exception('例外発生!'); // 例外を投げてcatchブロックへ進みます。
}catch (Exception $e){
undefined_function(); // 未定義の関数 → "Fatal error" を引き起こします。
}finally{
// finally ブロックの処理は、エラー表示より優先されるようです。
$html = <<<HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div style="margin:15em 1em">
<p>スクリプトの最後の "die()" を削除すれば、
<p>画面の最後に
<p>"Fatal error" のメッセージを見ることは可能ですが、
<p>"finally ブロック" の処理の後にメッセージが表示されるので、
<p>もしも、"finally ブロック" が
<p>ウインドウサイズよりも上下に長いコンテンツを表示する場合、
<p>"Fatal error" が発生していることに気付くことは難しいかもしれません。
</div>
</body>
</html>
HTML;
echo $html;
die(); // エラー表示の直前で処理を打ち切ってしまいます。
}
スクリプトの最後のdie()
を削除すると、画面の最後にFatal error
の表示が復活します。
まとめ
PHP のfinally
ブロックには、die()
やexit()
は書かないようにしましょう。
でも、Fatal error
のエラー表示は何よりも先に表示させて欲しいですよね?