1. Yii2 的 errorHandler
包含哪些部分?
想象一下,你在管理一个餐厅:
- 如果顾客在用餐时遇到了问题(如菜品有问题),你需要快速处理并给出合理的解决方案。
- 在 Yii2 中,
errorHandler
就像是餐厅的客服团队,负责处理应用程序中的错误和异常。
(1) 核心组成部分
- 错误捕获:
- 捕获 PHP 错误(如警告、注意)和未捕获的异常。
- 错误处理:
- 将错误转换为友好的格式(如 HTML 页面或 JSON 响应)。
- 日志记录:
- 将错误信息记录到日志文件中,便于后续排查。
- 调试工具:
- 在开发环境中提供详细的调试信息(如堆栈跟踪)。
(2) 主要方法
handleError()
:- 处理 PHP 错误(如 E_WARNING、E_NOTICE)。
handleException()
:- 处理未捕获的异常。
convertExceptionToResponse()
:- 将异常转换为响应内容(如 HTML 或 JSON)。
logException()
:- 将异常信息记录到日志文件中。
(3) 配置与自定义
- 默认配置:
errorHandler
是 Yii2 的核心组件之一,默认已注册。- 配置通常位于
config/web.php
文件中:'components' => [ 'errorHandler' => [ 'errorAction' => 'site/error', // 自定义错误页面 ], ],
- 自定义错误页面:
- 可以通过
errorAction
指定一个控制器动作来渲染错误页面。
- 可以通过
2. 使用场景是什么?
(1) 用户友好的错误提示
- 场景:当用户访问不存在的页面或发生服务器错误时,显示友好的错误页面。
- 示例:
public function actionError() { $exception = Yii::$app->errorHandler->exception; if ($exception !== null) { return $this->render('error', ['exception' => $exception]); } }
(2) 日志记录
- 场景:将错误信息记录到日志文件中,便于后续排查。
- 示例:
'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], ],
(3) 调试模式
- 场景:在开发环境中,显示详细的错误信息(如堆栈跟踪)。
- 示例:
defined('YII_DEBUG') or define('YII_DEBUG', true);
(4) API 错误响应
- 场景:在 RESTful API 中,返回结构化的 JSON 错误响应。
- 示例:
public function beforeAction($action) { Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; return parent::beforeAction($action); } public function actionError() { $exception = Yii::$app->errorHandler->exception; return [ 'error' => $exception->getMessage(), 'code' => $exception->getCode(), ]; }
3. 底层原理是什么?
(1) 错误捕获机制
- PHP 错误:
- Yii2 通过
set_error_handler()
函数捕获 PHP 错误。 - 示例:
set_error_handler([$this, 'handleError']);
- Yii2 通过
- 异常捕获:
- Yii2 通过
set_exception_handler()
函数捕获未捕获的异常。 - 示例:
set_exception_handler([$this, 'handleException']);
- Yii2 通过
(2) 错误处理流程
- 捕获错误或异常:
- 当应用程序中发生错误或抛出异常时,
errorHandler
会捕获它们。
- 当应用程序中发生错误或抛出异常时,
- 记录日志:
- 调用
logException()
方法将错误信息记录到日志文件中。
- 调用
- 生成响应:
- 调用
convertExceptionToResponse()
方法将错误转换为响应内容。
- 调用
- 渲染页面:
- 根据配置的
errorAction
渲染自定义错误页面。
- 根据配置的
(3) 开发与生产环境的区别
- 开发环境:
- 显示详细的错误信息(如堆栈跟踪)。
- 便于开发者快速定位问题。
- 生产环境:
- 显示简化的错误页面(如“500 Internal Server Error”)。
- 避免泄露敏感信息。
(4) 异常类
- 内置异常类:
- Yii2 提供了一些内置的异常类,如
yii\base\Exception
和yii\web\HttpException
。
- Yii2 提供了一些内置的异常类,如
- HTTP 异常:
- 使用
HttpException
抛出特定的 HTTP 状态码。 - 示例:
throw new \yii\web\NotFoundHttpException('The requested page does not exist.');
- 使用
4. 图示说明
(1) 错误处理流程
用户请求 -> 发生错误/异常
|
v
errorHandler 捕获错误/异常
|
v
记录日志 -> 生成响应 -> 渲染页面
(2) 开发与生产环境对比
开发环境:
+--------------------------+
| 显示详细错误信息 |
| (如堆栈跟踪、变量值) |
+--------------------------+
生产环境:
+--------------------------+
| 显示简化错误页面 |
| (如 500 Internal Server Error) |
+--------------------------+
5. 总结
(1) 核心组成部分
- 错误捕获:捕获 PHP 错误和未捕获的异常。
- 错误处理:将错误转换为友好的格式。
- 日志记录:记录错误信息到日志文件。
- 调试工具:在开发环境中提供详细的调试信息。
(2) 使用场景
- 用户友好的错误提示。
- 日志记录。
- 调试模式。
- API 错误响应。
(3) 底层原理
- 错误捕获机制:通过
set_error_handler()
和set_exception_handler()
捕获错误和异常。 - 错误处理流程:记录日志、生成响应、渲染页面。
- 开发与生产环境区别:开发环境显示详细信息,生产环境隐藏敏感信息。
- 异常类:支持内置异常类和 HTTP 异常。