建立 application 下建立common/exception
目录.
新建ExceptionHandler.php
<?php namespace app\common\exception; use think\exception\Handle; use think\Log; use Exception; /** * 重写 Handle 的 render 方法,实现自定义异常消息 * Class ExceptionHandler * @package app\common\library\exception */ class ExceptionHandler extends Handle { private $code; private $message; /** * 输出异常信息 * @param Exception $e * @return \think\Response|\think\response\Json */ public function render(Exception $e) { if ($e instanceof BaseException) { $this->code = $e->code; $this->message = $e->message; } else { if (config('app_debug')) { return parent::render($e); } $this->code = 0; $this->message = $e->getMessage() ?: '很抱歉,服务器内部错误'; $this->recordErrorLog($e); } return json(['msg' => $this->message, 'code' => $this->code]); } /** * 将异常写入日志 * @param Exception $e */ private function recordErrorLog(Exception $e) { Log::record($e->getMessage(), 'error'); Log::record($e->getTraceAsString(), 'error'); } }
新建BaseException.php
<?php namespace app\common\exception; use think\Exception; /** * Class BaseException * 自定义异常类的基类 */ class BaseException extends Exception { public $code = 0; public $message = 'invalid parameters'; /** * 构造函数,接收一个关联数组 * @param array $params 关联数组只应包含 code、msg,且不应该是空值 */ public function __construct($params = []) { if (!is_array($params)) { return; } if (array_key_exists('code', $params)) { $this->code = $params['code']; } if (array_key_exists('msg', $params)) { $this->message = $params['msg']; } } }
在模块目录下或全局config.php
里修改:
'default_return_type' => 'json', // 异常处理 handle 类 留空使用 \think\exception\Handle 'exception_handle' => 'app\common\exception\ExceptionHandler',
这样用 THINKPHP5 写 API 报错就不会返回 html 页面拉..返回是 json 格式.