TOOL更新_ToDoリスト「23.エラーをハンドリングしたい。」、「24.ログを出したい。」を作った
ToDoリスト「http://d.hatena.ne.jp/kazpgm/20090403」の「23.エラーをハンドリングしたい。」、「24.ログを出したい。」のプログラムを作った。
1.「23.エラーをハンドリング」に対応した。23番は完了とする。
2.「24.ログを出したい。」の対応としてエラーログを出すようにした。24番はデバック用のログ出力のみ未完になった。エラーログはDBエラーを出していたlogと同じファイルに出力する。
3.方法。「common.php」(すべてのPGMがrequire_onceしている)に「set_error_handle」した。具体的には以下を追加した。
// エラーハンドリング function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) { global $db; // エラー文字列の連想を定義 // 実際に考慮するエントリは 2,8,256,512,1024のみ $errortype = array ( 1 => "Error", 2 => "Warning", 4 => "Parsing Error", 8 => "Notice", 16 => "Core Error", 32 => "Core Warning", 64 => "Compile Error", 128 => "Compile Warning", 256 => "User Error", 512 => "User Warning", 1024=> "User Notice" ); echo 'The error occurred. ' . ' Errno: ' . $errno . ' Errortype: ' . $errortype[$errno] . "<br />\n"; $fp = fopen(DIR_LOG . date('Ymd') . '_log.txt', 'a'); flock($fp, LOCK_EX); fwrite($fp, 'Date: ' . date('Y/m/d H:i:s') . "\n"); fwrite($fp, 'Errno: ' . $errno . "\n"); fwrite($fp, 'Errortype: ' . $errortype[$errno] . "\n"); fwrite($fp, 'Message: ' . $errmsg . "\n"); fwrite($fp, 'Filename: ' . $filename . "\n"); fwrite($fp, 'Linenum: ' . $linenum . "\n"); fwrite($fp, "----------\n"); flock($fp, LOCK_UN); fclose($fp); if (!empty($db)) { $sql = "rollback"; $db->query($sql); } exit; } // 独自のエラー処理(E_NOTICE以外)を行う error_reporting(E_ALL ^ E_NOTICE); $old_error_handler = set_error_handler("userErrorHandler", E_ALL ^ E_NOTICE);
4.エラーlogはこんな感じで出している。
Date: 2009/07/03 00:52:50 Errno: 2 Errortype: Warning Message: mkdir() [<a href='function.mkdir'>function.mkdir</a>]: No such file or directory Filename: C:\Tools\XAMPP\xampplite\htdocs\.kazphp\functions.php Linenum: 516
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
5.エラー画面にはこんな感じ。
The error occurred. Errno: 2 Errortype: Warning
21:00-03:00