1. 程式人生 > >php錯誤及異常處理

php錯誤及異常處理

現在php開發基本都使用框架,而框架一般都封裝了自己的異常處理,但是,有時候也會有比較坑的框架,只能處理業務錯誤,不僅無法追蹤系統錯誤,還遮蔽了系統錯誤,所以最近寫了一個異常處理類,大家只需要在框架的核心檔案include一下,在需要使用的時候
new SystemDebug();

一下即可

下面把程式碼分享給大家

/**
 * Class SystemDebug
 * @package System\debug
 * 異常處理
 */
class SystemDebug{
    public function __construct(){
        error_reporting(E_ALL);
        register_shutdown_function('SystemDebug::fatalError');
        set_error_handler('SystemDebug::appError');
        set_exception_handler('SystemDebug::appException');
    }

    /**
     * 致命的錯誤
     */
    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();
                    die("<h1>致命的錯誤</h1><hr><p>錯誤程式碼:{$e['type']}</p><p>錯誤原因:{$e['message']}</p><p>錯誤路徑:{$e['file']}</p><p>錯誤行號:{$e['line']}</p>");
                    break;
            }
        }
    }

    /**
     * @param $errno
     * @param $errstr
     * @param $errfile
     * @param $errline
     * 自定義錯誤
     */
    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();
            die("<h1>自定義錯誤</h1><hr><p>錯誤程式碼:{$errno}</p><p>錯誤原因:{$errstr}</p><p>錯誤路徑:{$errfile}</p><p>錯誤行號:{$errline}</p>");
                break;
            default:
                
                break;
        }
    }

    /**
     * @param $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();
        die("<h1>發生異常</h1><hr><p>錯誤原因:{$error['message']}</p><p>錯誤路徑:{$error['file']}</p><p>錯誤行號:{$error['line']}</p>");
    }
}

執行結果如下

呼叫了不存在的方法

trigger_error("使用者自定義業務錯誤");


throw new Exception("丟擲了異常");