建立 application 下建立common/exception目录.
新建ExceptionHandler.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
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 格式.
~谢谢打赏~
赏