TP5.1+中exception_handle配置已废弃,需使用app/ExceptionHandle.php类并重写render()方法,结合Request判断API场景返回Response::create($data, 'json'),同时注册error_handler处理PHP错误。

TP5 的 500 错误默认返回 HTML 页面,无法统一成 JSON 格式——这不是代码写错了,是异常处理没接管响应格式。
为什么 exception_handle 配置不生效?
很多人在 config/app.php 里写了 'exception_handle' => 'app\exception\Handler::handle',但 500 依然吐 HTML。根本原因是:TP5.1+ 的异常处理入口已改为 app/ExceptionHandle.php 类,配置项 exception_handle 在 5.1 中已被废弃,设了也无效。
- 检查
app/ExceptionHandle.php是否存在且继承自thinkexceptionHandle - 确认
app/ExceptionHandle.php中的render()方法是否被调用(加var_dump('hit');测试) - 若使用多应用模式,确保该类路径和命名空间与当前应用匹配(如
appindexExceptionHandle)
render() 方法怎么返回 JSON?
关键不是“捕获异常”,而是“控制输出格式”。TP5 默认对非 AJAX 请求返回 HTML 模板,必须显式判断并覆盖。
- 在
render()中先判断请求是否为 API 场景:$request->isAjax() || $request->header('accept') === 'application/json' - 避免直接
return json(...),应使用Response::create(..., 'json')确保 Content-Type 正确 - 生产环境要屏蔽堆栈信息:
!app()->isDebug() ? $e->getMessage() : $e->getTraceAsString() - 示例片段:
public function render($request, Throwable $e): Response { $data = [ 'code' => 500, 'msg' => app()->isDebug() ? $e->getMessage() : '服务器内部错误', 'data' => [] ]; return Response::create($data, 'json')->code(500); }
为什么有些 500 还是 HTML?
常见漏网之鱼不是 PHP 异常,而是底层 PHP 错误(如 E_ERROR、E_PARSE),它们不会走 ExceptionHandle,而走 thinkexceptionErrorHandle。
立即学习“PHP免费学习笔记(深入)”;
- TP5.1+ 默认未启用
ErrorHandle,需在app/ExceptionHandle.php中手动注册:error_reporting(E_ALL); set_error_handler([$this, 'appError']); - 或更稳妥地,在
public/index.php开头加:set_error_handler(function($errno, $errstr) { throw new ErrorException($errstr, $errno); }); - 注意:语法错误(
Parse error)无法被捕获,只能靠开发阶段的 IDE 提示和php -l检查
真正卡住人的,往往不是怎么写 render(),而是没意识到 TP5.1 的异常链分成了 Exception / Error / Fatal 三层,而你只改了其中一层。API 项目上线前,务必用 curl -H "Accept: application/json" http://test.com/bad-route 实测所有错误分支。



















