運用後のエラーをどうするか
テスト漏れがあった場合、ユーザが利用中にPHPのエラーが起こる。
その場合どうするか考える。
もちろんwebに生のエラーを吐き出してはいけない。
手っ取り早いのが set_error_handler() を使って全てのエラーを捕まえる。
そうしておいてログに書いたりメールを送ったりする。
自分の場合はこんなの。
<?php ... /** * ユーザエラー処理関数 * * @param int $level エラーレベル * @param string $msg エラーメッセージ * @param string $file 標準エラーから呼ばれたときのエラーファイル名 * @param string $line 標準エラーから呼ばれたときのエラー行数 * @param string $text 標準エラーから呼ばれたときのメッセージ * @access public */ function laizError($level, $msg, $file=null, $line=null, $text=null){ // @(エラー制御演算子)がついている場合はerror_reportingの値がゼロになる $rep = error_reporting(); $e = LaizErrorUtilsCreator::getInstance(); $level = $level & $rep; $error = E_ERROR | E_USER_ERROR; $warning = E_WARNING | E_USER_WARNING; $notice = E_NOTICE | E_USER_NOTICE; $strict = E_STRICT; switch (true){ case ($level & $error): $e->error($msg); break; case ($level & $warning): $e->warning($msg); break; case ($level & $notice): $e->notice($msg); break; case ($level != 0): // キャッチできなかったエラーは標準エラーに引き継ぎ return false; break; } return true; } // 標準のエラーハンドラを書き換える set_error_handler('laizError'); error_reporting(E_ALL | E_STRICT);
注意点としては、外部ライブラリが@エラー制御演算子なんかを使っている場合、error_reporting()に応じた処理をしないと大変なことになる。
で、エラー処理クラスの中で http://php.net/debug-backtrace を使って独自にトレース出力をしてるわけだが・・
ここで、関数呼び出しトレースだけでは足りない場合がある。そもそもテスト時に気付かなかったほどのまれなエラーなら、ある特定の状態でしか起こらない可能性が高い。そんなわけでエラーレポートに何情報を出力すればいいのか悩む。
var_export() で引数などを全部出せば大抵のことが分かるが、これだと情報が多すぎて逆に厄介。
現状では取り敢えず$_REQUESTなんかを出力してみて、しばらく様子を見ることにする。