必须重写app/exception/Handler.php的render()方法来统一处理错误页面,通过判断异常类型、请求方式(AJAX/HTML)和环境(APP_DEBUG),分别返回视图页、JSON响应或跳转,禁用敏感信息输出。

ThinkPHP6.0 默认错误页面是开发调试时的异常展示页,上线后需替换为友好、统一的错误提示(如 404、500 页面),不能靠简单改模板文件实现——它由异常处理器控制,必须通过自定义 `Handler` 类接管渲染逻辑。
重写 app/exception/Handler.php 的 render 方法
这是唯一有效方式。TP6 的错误响应流程终点是 render() 方法,所有未捕获异常都会流经这里。不重写它,就无法改变输出内容或结构。
- 确保该类实现了 think\contract\ExceptionHandlerInterface 接口,否则框架会静默忽略你的 Handler
- 在 render() 中判断异常类型:HTTP 异常(如
HttpException)走视图页,业务异常或 PHP 错误可统一返回 JSON 或跳转 - 对 404 场景,推荐返回
view('error/404');500 则用view('error/500'),模板路径按实际 view 目录结构调整
准备对应的错误视图模板
TP6 默认只支持 PHP 原生模板,若要用 think-template(即 .html 模板),需先安装 think-view 扩展:
- 执行
composer require topthink/think-view - 修改
config/view.php中'type' => 'think'(不是 'php') - 在
view/error/下新建404.php或404.html,内容可含简单 HTML + 变量(如=$exception->getMessage()?>)
区分环境,避免暴露敏感信息
生产环境绝不能显示堆栈、文件路径或环境变量。TP6.0.3+ 已默认隐藏调试页中的 env 信息,但仍需主动控制:
- 在 render() 中检查
env('APP_DEBUG', false),为 false 时强制返回精简提示,不输出异常详情 - 不要在错误页中直接 echo
$exception->getTraceAsString()或$_ENV - 若需记录日志,调用
Log::record()即可,页面上只呈现用户友好的文案(如“页面走丢了”“服务器忙不过来”)
API 请求要单独处理,不渲染 HTML
前后端分离项目中,AJAX 或接口请求出错,不该返回 HTML 页面,而应保持 JSON 格式:
- 在 render() 中检测请求是否为 AJAX:
$request->isAjax() || $request->header('accept') === 'application/json' - 匹配则返回标准结构:
json(['code' => 500, 'msg' => '服务器内部错误']),状态码设为对应 HTTP 码(如 404 →response()->code(404)) - 避免混用:一个 Handler 同时支持页面跳转和 API 响应,靠请求特征自动分流
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











