PHP錯誤及異常統一處理

php中錯誤及異常的統一收集並處理,主要就是用到3個內部方法:php

1. register_shutdown_function(callable $callback [, mixed $parameter [, mixed $... ]) //php程序執行完成後執行的函數app

它執行機制是:當頁面全部PHP語句都執行完成時,再調用此 函數。注意,在這個時候它是從內存中調用,不是從PHP頁面中調用,因此在此回調函數中不能使用相對路徑。如下狀況時會觸發此函數執行:函數

1)當頁面被用戶強制中止時code

2)當程序代碼運行超時時對象

3)當PHP代碼執行完成時,代碼執行存在異常和錯誤、警告內存

在錯誤收集的使用上,需配合php另外一個錯誤收集函數來實現:error_get_last(),代碼如:get

register_shutdown_function('ExceptionHandle::fatalError');

//也能夠對象方式調用

$a = new ExceptionHandle();

register_shutdown_function([$a,'fatalError']);

class ExceptionHandle {

// 致命錯誤捕獲
static public function fatalError() {
    if($e = error_get_last()) {
        switch($e['type']) {
            case E_ERROR:
            case E_PARSE:
            case E_CORE_ERROR:
            case E_COMPILE_ERROR:
            case E_USER_ERROR:
                ob_end_clean();
                //此處添加業務邏輯,如記錄log或展現錯誤頁面等
                break;
        }
    }
}

}

另外,須要注意:回調函數

1)它能夠被屢次調用,這些被註冊的回調會按照他們註冊時的順序被依次調用string

2)當程序因爲 exit 、die和未處理的異常、錯誤結束時,不會觸發該函數--此種狀況,因此須要後面2個錯誤/異常函數來捕捉it

3)PHP4後支持註冊函數參數傳遞

2. set_error_handler(array(‘Debug’,'appError’)); //設置一個用戶定義的錯誤處理函數

class ExceptionHandle {

/**
 * 自定義錯誤處理
 * @access public
 * @param int $errno 錯誤類型
 * @param string $errstr 錯誤信息
 * @param string $errfile 錯誤文件
 * @param int $errline 錯誤行數
 * @return void
 */
static public function appError($errno, $errstr, $errfile, $errline) {
    switch($errno) {
        case E_ERROR:
        case E_PARSE:
        case E_CORE_ERROR:
        case E_COMPILE_ERROR:
        case E_USER_ERROR:
            ob_end_clean();
            $errorStr['errno']    = $errno;
            $errorStr['message'] = $errstr;
            $errorStr['file']    = $errfile;
            $errorStr['line']    = $errline;
            //添加實際錯誤處理邏輯
            break;
        default:
            //其餘非致命類型錯誤只記錄log,防止對頁面影響
            break;
    }
}

}

3. set_exception_handler(array(‘Debug’,'appException’)); //自定義異常處理。

class ExceptionHandle {

/**
 * 自定義異常處理
 * @access public
 * @param mixed $e 異常對象
 */
static public function appException($e) {
    $error            = array();
    $error['message'] = $e->getMessage();
    $trace            = $e->getTrace();
    if('E' == $trace[0]['function']) {
        $error['file'] = $trace[0]['file'];
        $error['line'] = $trace[0]['line'];
    } else {
        $error['file'] = $e->getFile();
        $error['line'] = $e->getLine();
    }
    //處理換行
    $error['trace'] = $e->getTraceAsString();

    //添加實際異常處理邏輯
}

}

===========美美的分割線================

注意:set_error_handler()、set_exception_handler()2個註冊的回調函數均不會屢次調用,即若是註冊多個,以最後一個爲生效回調。

經過以上3個函數註冊,就能夠很好的在一個你想要的地方統一接收項目裏因此的錯誤、異常等信息,並作相應的處理,好比寫log或展現友好的錯誤頁等

相關文章
相關標籤/搜索