简要说明
- 灵活配置404、500页面
- 区分Ajax请求、Get请求返回
逻辑设计
GET: 404显示404页面,其余异常均显示500页面
Ajax: 异常统一返回Code = 400,Message = Server exception
错误日志: 除404外,均写入错误日志
配置过程
查看开发文档 异常处理(5.0) / 异常处理(5.1) 章节。
按照官方推荐,在config/app.php(5.1)
/ application/config.php(5.0)
文件中,自定义异常页面模板 及 配置异常处理文件:
'http_exception_template' => [
// 定义404错误的模板文件地址
404 => Env::get('app_path') . '404.html',
]
// 异常页面的模板文件
//'exception_tmpl' => Env::get('think_path') . 'tpl/think_exception.tpl',
'exception_tmpl' => Env::get('app_path') . '500.html',
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle' => '\\app\\common\\exception\\Http',
app\common\exception\Http.php
<?php
/**
* AppName
* ============================================================================
* 版权所有 ****,并保留所有权利。
* ----------------------------------------------------------------------------
* 异常处理
* GET: 404显示404页面,其余异常均显示500页面
* POST: 异常统一返回Server exception
* 错误日志: 除404外,均写入错误日志
* ============================================================================
* Author: 暴走的西瓜
*/
namespace app\common\exception;
use Exception;
use think\exception\Handle;
use think\exception\HttpException;
class Http extends Handle
{
public function render(Exception $e)
{
if (Config('app.app_debug')) {
Config('exception_tmpl', env('think_path') . 'tpl/think_exception.tpl');
return parent::render($e);
}
if (!$e instanceof HttpException) {
$errorLog = '';
$errorLog .= "errorCode:500";
$errorLog .= "\nerrorMessage:".$e->getMessage();
$errorLog .= "\nip:".request()->ip();
$errorLog .= "\nurl:".request()->url(true);
$errorLog .= "\nmethod:".request()->method();
!empty(request()->param()) ? $errorLog .= "\nparam:".json_encode(request()->param()) : null;
if (request()->isAjax()) $errorLog .= "\nisAjax:true";
// write log
logs($errorLog);
}
// Ajax提交,统一返回Server exception
if (request()->isAjax()) return jsonFailed('Server exception');
return parent::render($e);
}
}
以上代码及配置说明:
- 验证app_debug是否开启。开启:正常返回错误调试信息;关闭:捕获异常,对应处理;
- 验证是否非404,本文设计除 404 外,均写出错误日志;
- 验证是否为 Ajax 提交,返回 Code = 400, Message = 'Server exception'
扩展信息
由于官方5.0 / 5.1 版本Log
不支持自定义文件夹。这里我们在application/common.php
中自定义Logs
或者myLog
处理方法:
application/common.php Log Write function
/**
* Log Write
* @param string $data
* @param string $path
*/
function logs($data = '', $path = '')
{
if (empty($data)) return false;
if (empty($path)) $path = 'error';
$path = Env::get('runtime_path').'log/'.$path;
if (!is_dir($path)) $mkdir_re = mkdir($path, 0777, TRUE);
$path = $path.'/'.date('Y-m-d').'.log';
$data = date('Y-m-d H:i:s') . "\n" . (is_array($data) ? serialize($data) : $data) . "\n\n";
$handle = fopen($path, 'a');
fwrite($handle, $data);
fclose($handle);
}