0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPで"Fatal error"が表示されない不具合(?)

Posted at

いくら例外を投げても無反応だったので、原因を徹底調査しました。
すると、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の表示が復活します。

Fatal error 表示

まとめ

PHP のfinallyブロックには、die()exit()は書かないようにしましょう。
でも、Fatal errorのエラー表示は何よりも先に表示させて欲しいですよね?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?