PHPのエラーハンドラ、例外処理でくくろうかと思ったとある処理が実は「例外じゃ無いエラー」を吐いて止まってたことが判って例外じゃ無いエラーってなんだそれそんなのどうにかしろというのかという感じです。
例外処理では例外じゃ無いエラーを処理できません、って言う意味不明な仕様で頭が痛いところにくわえて、その「例外じゃ無いエラー」をフックする方法が‥‥、
http://keicode.com/cgi/php-error-handling.php
エラーハンドラは、set_error_handler 関数で指定します。
次の例では $i = 5/0; の行で 0 除算の警告が発生しますが、その箇所でユーザー定義のエラーハンドラである my_error_handler 関数が呼ばれます。
ということで、
<?php set_error_handler( 'my_error_handler', E_ALL ); $i = 5/0; function my_error_handler ( $errno, $errstr, $errfile, $errline, $errcontext ) { echo "[$errno] $errstr $errfile($errline)\n"; } ?>
をスクリプトの名前空間じゃ無いところに記述する必要がある(??)のにくわえて、
ただし、次のタイプのエラーはこのユーザー定義のエラーハンドラで処理できない、と PHP のサイトに書いてあります。
E_ERROR
E_PARSE
E_CORE_ERROR
E_CORE_WARNING
E_COMPILE_ERROR
E_COMPILE_WARNING
(ry
そこで、上記のようなエラーハンドラ関数で処理できないエラーについては、スクリプトのシャットダウン関数を利用して処理します。シャットダウン関数は register_shutdown_function 関数で指定します。
(ry
それでは Fatal エラーは常に復帰できないか、というと実はそうでもなく、try-catch で例外をキャッチすることで、プログラムの実行を継続することが可能な場合もあります。
(ry
エラーハンドラをセットしているにもかかわらず、エラーハンドラに入りません。
エラーメッセージを見ると、例外が発生していることがわかりますので、次のように try-catch で例外を捕捉します。
(ry
確かに例外処理ハンドラが呼び出されていることはわかりますが、処理は元の場所へ復帰するわけではなく、そこで終了します。
(ry
‥‥、
で、結局どうしろっちゅうねん!!!