2011,04,01, Friday
PHPでErrorExceptionを使ったエラーハンドリング処理を実装し、よりセキュアな作りに挑戦しようとしたんだけど、Warningやらなんやら投げるようしたら使い勝手が悪くなりすぎた。
っていうか、一番取りたいERRORは有無を言わさずプログラム停止するって仕様はどうなのよ?
未定義の関数を呼び出した時のFatalErrorくらい拾ってほしい…。
ERROR以外は、ページ表示した後 WARNING何件 NOTICE何件、詳細はこうって感じで出せるようにならないかなぁ?
WARNING程度で ERRORと同じ処理をするのは不便すぎるなぁ。
で、こうするのがいいんじゃないかなと思った方法を掲載してみます~
/**
* Error Handlerの定義
* Warningや Noticeなど、発生したメッセージをエラーハンドリングし、
* ErrorExceptionオブジェクトにしておいて、stdClassオブジェクトのプロパティに保存していきます。
* これを Zend_Registryで保持しておくので、後でどこからでも取り出すことができます。
*/
{
// (E_ALL | E_STRICT)発生時に呼び出される関数を登録します。
set_error_handler(
function ($errno, $errstr, $errfile, $errline, $errcontext)
{
// レジストリに登録があるかを確認し、あれば取り出します。
if (Zend_Registry::isRegistered('myErrorException'))
{
$myerr = Zend_Registry::get('myErrorException');
}
// なければ stdClassオブジェクトを生成し、
// エラーを保存するプロパティを用意して、
// レジストリに登録します。
else
{
$myerr = new stdClass;
$myerr->e = array();
Zend_Registry::set('myErrorException', $myerr);
}
// ErrorExceptionオブジェクトを生成し、プロパティに格納します。
$myerr->e[] = new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
, (E_ALL | E_STRICT)
);
}
すべての処理が終わった後、これを煮るなり焼くなりすればいいかと^^
Zend_Logで、Firebugのコンソールへ送る方法があるようなので、それを使う実装ができるといいんじゃないかなぁって思います。
あ、これ、PHP5.3以降対応です。無名関数のところを書き変えれば PHP5以上で動作すると思います。
関連する関数・ライブラリについては、以下を参照のこと。
PHPマニュアル set_error_handler()
http://jp.php.net/manual/ja/function.set-error-handler.php
ZendFrameworkマニュアル Zend_Registry
http://framework.zend.com/manual/ja/zend.registry.html
コメント
Pearライブラリが鬼のように Noticeを吐く…
む無理ー^^
最新版なら大丈夫なのかな? Pear2ってどうなったんだろう?
む無理ー^^
最新版なら大丈夫なのかな? Pear2ってどうなったんだろう?
| しょうなり | EMAIL | URL | 2011/04/01 10:33 PM | Yo9WBngs |
コメントする
この記事のトラックバックURL
http://www.shiftra.jp/shounari/tb.php/68
トラックバック
PAGE TOP ↑