2012年12月13日 星期四

用set_error_handler自訂PHP錯誤處理

用 set_error_handler 可以捕捉 php 的錯誤,並自訂要如何處理。
set_error_handler 說明:http://php.net/manual/en/function.set-error-handler.php
以下例子則是將捕捉的錯誤丟出 Exception,
因為php的錯誤訊息編碼,似乎是跟著作業系統的編碼(在windows系統),而我也不知如何修改,
所以我先用setlocale(LC_ALL, "")取得系統語系,
判斷系統是不是簡體的,若不是則當繁體處理,
然後再統一用 mb_convert_encoding 轉成 UTF8
function handleError($errno, $errstr, $errfile, $errline, array $errcontext) {
    if (0 === error_reporting()) {
        return false;
    }
    /*
    if (preg_match('/936$/', setlocale(LC_ALL, ""))) {
        $sys_encoding = "GBK"; //簡體
    } else {
        $sys_encoding = "BIG5";
    }*/
    $sys_encoding = "UTF-8,BIG5,gb2312,gbk";
    $errstr = mb_convert_encoding($errstr, "UTF-8", $sys_encoding);
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

set_error_handler('handleError');

註1:2013-01-28 遇到一個環境,setlocale(LC_ALL, "") 的值是 Chinese_Taiwan.950,但 PHP 錯誤訊息編碼是 UTF8,還要再研究看看 PHP 錯誤訊息的編碼是怎麼決定的。
註2:2013-02-04 使用 sqlsrv 操作 MS SQL 時,發現資料庫密碼錯誤回傳訊息是 UTF8 的編碼,query 時語法錯誤則是回傳 Big5 的編碼,所以改設定 mb_convert_encoding 的第二參數設定可能的編碼。

沒有留言:

張貼留言