yii各版本错误处理机制不同:yii1.1用cerrorhandler+erroraction配置;yii2基于errorhandler组件分发视图,需确保url重写正确;yii3改用psr-15中间件和自定义exceptionhandlerinterface实现灵活控制。

Yii1.1:靠 CErrorHandler + errorAction 配置
Yii1.1 使用 CErrorHandler 统一接管异常和 PHP 错误,自定义页面依赖控制器动作和视图配合。
- 在
protected/config/main.php的components中配置:'errorHandler'=>array( 'errorAction'=>'site/error' ), -
SiteController::actionError()必须存在,且需手动获取错误信息:$error = Yii::app()->errorHandler->error;
然后$this->render('error', $error); - 视图文件固定为
protected/views/site/error.php,可直接使用$error['code']、$error['message']等字段 - 注意:开发环境(
YII_DEBUG=true)会强制显示调试堆栈,不走自定义页;生产环境才生效
Yii2:基于 errorHandler 组件 + errorAction + 视图分发
Yii2 将错误处理模块化,更灵活,但需明确区分 Web 请求与 API 请求,且 Web 服务器(Nginx/Apache)不能提前拦截 404。
- 基础配置在
config/web.php:'errorHandler' => ['errorAction' => 'site/error'], -
SiteController::actionError()推荐用ErrorAction类(简洁)或手动逻辑:$exception = Yii::$app->errorHandler->exception;
再根据类型分发视图,例如:if ($exception instanceof \yii\web\NotFoundHttpException) { return $this->render('error-404'); } - 视图路径为
@app/views/site/error.php(默认),若用errors/error,则视图必须是@app/views/errors/error.php - 关键前提:确保 URL 重写规则正确(如 Nginx 的
try_files $uri $uri/ /index.php?$args;),并启用enablePrettyUrl,否则 404 被 Web 服务器吃掉,Yii 根本收不到请求
Yii3:全新架构,取消全局 errorHandler,改用中间件 + 异常处理器
Yii3 彻底重构了错误处理流程,不再依赖组件配置,而是通过 PSR-15 中间件链和可插拔的异常处理器(ExceptionHandlerInterface)实现。
- 自定义错误页需实现
yii\web\exception\ExceptionHandlerInterface,例如:class CustomExceptionHandler implements ExceptionHandlerInterface { public function render(\Throwable $throwable): ResponseInterface { ... } } - 在应用启动时注册(如
config/web.php或 bootstrapping 阶段):'exceptionHandler' => CustomExceptionHandler::class, - 视图渲染由你完全控制,推荐返回
HtmlResponse或JsonResponse,无固定路径约束;可自由组织模板位置(如resources/views/errors/404.php) - 404 处理更自然:路由未匹配时自动抛
yii\web\exceptions\NotFoundException,交由你的处理器统一响应,无需担心 Web 服务器兜底干扰











