thinkphp 6.0+ 通过全局异常处理类 app\exceptionhandle 实现统一异常管理,核心做法是重写 render 方法并返回标准化的 json 响应。在 app\exceptionhandle.php 中,根据 $e->getcode() 或 $e->getmessage() 判断业务错误类型,使用 json() 助手函数或 response 对象返回包含 code、msg 和 data 的数组;对于未捕获的系统异常,默认记录日志并返回 500 状态码及通用错误提示。

如何配置自定义异常处理类?
需要在 config\app.php 中指定 exception_handle 参数为 app\ExceptionHandle 类的完全限定名,确保框架启动时加载该处理器。

namespace app;
use think\exception\Handle;
use think\facade\Log;
use think\response\Json;
class ExceptionHandle extends Handle
{
public function render($request, \Throwable $e): Json
{
// 记录系统异常日志
if ($this->isDebug()) {
Log::error($e->getMessage());
}
// 获取错误码和消息
$code = $e->getCode() ?: 500;
$msg = $e->getMessage() ?: '服务器内部错误';
// 如果是业务逻辑异常(如自定义的 BusinessException)
if (method_exists($e, 'getCode') && is_int($e->getCode())) {
$code = $e->getCode();
$msg = $e->getMessage();
}
return json(['code' => $code, 'msg' => $msg, 'data' => null]);
}
protected function isDebug()
{
return config('app.app_debug');
}
}
上述代码展示了完整的 ExceptionHandle 结构。首先继承 think\exception\Handle,然后重写 render 方法。该方法接收当前请求 $request 和抛出的异常 $e。在方法体内,先检查是否开启调试模式,若开启则调用 Log::error 记录详细堆栈信息。接着提取异常的状态码和消息,如果异常是自定义的业务异常,通常其 getCode() 会返回非零的业务错误码,此时直接使用该码;否则默认为 500。最后通过 json() 助手函数返回一个关联数组,前端可根据 code 字段判断请求是否成功。
立即学习“PHP免费学习笔记(深入)”;
如何处理特定类型的业务异常?
在实际开发中,应定义自定义异常类(如 BusinessException),并在控制器或模型中抛出这些实例,以便在 ExceptionHandle 中进行差异化处理,例如区分参数校验失败(400)和数据不存在(404)。

// 自定义异常类
namespace app\exception;
class BusinessException extends \Exception
{
public function __construct(string $message = '', int $code = 1001)
{
parent::__construct($message, $code);
}
}
// 控制器中使用
public function test()
{
throw new BusinessException('用户ID不存在', 1001);
}
为了配合 ExceptionHandle 工作,建议创建一个基类 BusinessException,它继承自 PHP 原生 \Exception。构造函数接受消息和错误码,默认错误码设为 1001 表示通用业务错误。在控制器中,当检测到业务逻辑错误(如数据库查询结果为空但预期应有数据)时,直接 throw new BusinessException(...)。回到 ExceptionHandle 的 render 方法中,可以通过 instanceof 判断是否为 BusinessException 实例,从而赋予其特定的 HTTP 状态码(如 400 或 404)而非默认的 500。这样前端收到响应后,可以根据 code 值精准展示用户友好的提示信息,而无需解析复杂的堆栈信息。
基于抛出异常时的具体返回结果是什么?
当在控制器中抛出 new BusinessException('参数错误', 400) 时,最终返回给客户端的 JSON 数据结构为 {"code": 400, "msg": "参数错误", "data": null},且 HTTP 状态码由 ExceptionHandle 中的逻辑决定,通常需手动设置或通过中间件调整。



















