errorHandler 配置不生效的主因是位置错误、YII_DEBUG=true 或视图路径/命名不符规则;必须在 config/web.php 的 components 中配置 errorAction,且 YII_DEBUG 为 false 时才生效,视图文件名必须为 error.php。

errorHandler 配置不生效?八成是写错位置、环境没切对,或视图路径/命名不符合硬规则。
errorAction 必须在 config/web.php 的 components 里配
它只在应用级组件配置中起作用,不是在控制器、行为或 anywhere else。写在 SiteController::actions() 或 behaviors() 里完全无效。
- 正确位置:
'components' => ['errorHandler' => ['errorAction' => 'site/error']](在config/web.php或main.php中) -
errorAction值必须是合法路由格式,如'admin/site/error'要配合'route' => 'admin/site/error'才能进模块内控制器 - 对应动作必须存在且返回视图,不能只是抛异常;例如
SiteController::actions()应包含'error' => ['class' => 'yii\web\ErrorAction']
@app/views/site/error.php 是唯一默认查找路径
Yii2 不会自动匹配 error-404.php 或 error.php 在其他目录 —— 它严格按 errorAction 的 controller 部分拼路径,且文件名必须叫 error.php。
- 若
errorAction是'errors/500',则找@app/views/errors/error.php(不是500.php) - 视图里可直接用
$exception和$statusCode变量,别指望$model或其他控制器传参自动带进来 - 开发时临时加
<?php var_dump($exception->getMessage()); ?>能快速确认是否真进到这个视图
YII_DEBUG=true 时 errorAction 被强制忽略
调试模式下 Yii2 直接显示自带的调试页(@yii/views/errorHandler/exception.php),根本不会跳转 site/error。这是设计行为,不是 bug。
- 想测试
site/error是否生效,必须设defined('YII_DEBUG') or define('YII_DEBUG', false);(在web/index.php) - 生产环境建议同时关掉
YII_DEBUG并打开日志记录:'log' => ['targets' => [...]],否则错误就丢了 - 若需调试时也走自定义页,得重写
renderException()方法并手动判断环境,但会失去堆栈高亮等调试功能
自定义 errorHandler 类要小心 renderException 返回值
继承 yii\web\ErrorHandler 后重写 renderException(),最容易出问题的是没返回字符串,或提前 echo/exit。
- 必须调用
parent::renderException($exception),否则默认视图逻辑不触发 - 方法里不能
echo内容,应return $this->render('error', ['exception' => $exception]) - 如果启用了
response.formats中的 JSON 或 XML 格式,HTTP 异常可能被转成非 HTML 响应,导致页面空白 —— 开发期建议只留'html' => \yii\web\HtmlResponseFormatter::class
真正卡住人的地方往往不是逻辑多复杂,而是 YII_DEBUG 状态、视图文件名拼写、路径大小写、以及 renderException() 没返回字符串这三件事。检查这三项,90% 的 “配置不生效” 就解决了。


















