// +---------------------------------------------------------------------- namespace think; class Error { /** * 自定义异常处理 * @access public * @param mixed $e 异常对象 */ static public function appException($e) { $error = []; $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(); // 记录异常日志 Log::record($error['message'],'ERR'); // 发送404信息 header('HTTP/1.1 404 Not Found'); header('Status:404 Not Found'); // 输出异常页面 self::halt($error); } /** * 自定义错误处理 * @access public * @param int $errno 错误类型 * @param string $errstr 错误信息 * @param string $errfile 错误文件 * @param int $errline 错误行数 * @return void */ static public function appError($errno, $errstr, $errfile, $errline) { $errorStr = "[{$errno}] {$errstr} {$errfile} 第 {$errline} 行."; switch ($errno) { case E_ERROR: case E_PARSE: case E_CORE_ERROR: case E_COMPILE_ERROR: case E_USER_ERROR: Log::record($errorStr, 'ERROR'); self::halt($errorStr); break; case E_STRICT: case E_USER_WARNING: case E_USER_NOTICE: default: Log::record($errorStr, 'NOTIC'); break; } } /** * 应用关闭处理 * @return void */ static public function appShutdown(){ // 记录日志 Log::save(); 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(); self::halt($e); break; } } } /** * 错误输出 * @param mixed $error 错误 * @return void */ static public function halt($error) { IS_CLI && exit(is_array($error)?$error['message']:$error); $e = []; if (Config::get('app_debug')) { //调试模式下输出错误信息 if (!is_array($error)) { $trace = debug_backtrace(); $e['message'] = $error; $e['file'] = $trace[0]['file']; $e['line'] = $trace[0]['line']; ob_start(); debug_print_backtrace(); $e['trace'] = ob_get_clean(); } else { $e = $error; } } else { //否则定向到错误页面 $error_page = Config::get('error_page'); if (!empty($error_page)) { header('Location: ' . $error_page); } else { if (Config::get('show_error_msg')) $e['message'] = is_array($error) ? $error['message'] : $error; else $e['message'] = C('error_message'); } } // 包含异常页面模板 include Config::get('exception_tmpl'); exit; } }