2011-07-10
PHPのFatal Errorを強制的にExceptionにする魔改造パッチ
GitHubに公開しました。
https://github.com/nubilum/PHP-fatal-error-patch
やってることはすげー簡単で、zend.cファイル内の最終的なエラーハンドリング処理がまとまっている関数内の処理を書き換えただけ。
下記のようなエラーをハンドリングできます。
◯関数ないエラー
<?php try { test(); }catch (Exception $e) { echo "catch!\n"; echo get_class($e) . " " . $e->getMessage() . " " . $e->getTraceAsString(); }
・出力結果
catch! Exception Fatal Error occured #0 /Users/***********/Documents/PHP/error.php(4): unknown() #1 {main}********:php-5.3.6_2 **********$ ./sapi/cli/php /Users/********/Documents/PHP/error.php
で、以下がダメなパターン。
◯メモリオーバー
<?php try { echo "処理開始"; test(); echo "処理終了"; }catch (Exception $e) { echo "catch!\n"; echo get_class($e) . " " . $e->getMessage() . " " . $e->getTraceAsString(); } function test(){ $aaa = ""; for ($i = 0; $i < 1000000; $i++) { $aaa .= "aaaaaaaaaaaa"; } }
◯出力結果
処理開始 //正常に終わらないし、catchもされない
まあこっちの問題については、どのみちcatchした後にも同じ分だけメモリ取ってたらまたエラーになって死ぬとかそういう問題があるので、そのへんはもちっとガチの対応が要りそうですね。
あとエラーメッセージを例外処理に渡してないので常に固定メッセージ。
需要ありそうならおいおい直していきます。
