错误处理(Handling Errors) - 请求处理(Handling Requests) - Yii Framework 2.0 权威指南 - 文档 - Yii Framework 中文社区
请求处理(Handling Requests) - 错误处理(Handling Errors)
Yii 内置了一个错误处理器,它使错误处理更方便,
Yii错误处理器做以下工作来提升错误处理效果:
所有非致命PHP错误(如,警告,提示)会转换成可获取异常;
异常和致命的PHP错误会被显示,
在调试模式会显示详细的函数调用栈和源代码行数。
支持使用专用的
来显示错误;
支持不同的错误响应格式;
错误处理器默认启用,
可通过在应用的中定义常量YII_ENABLE_ERROR_HANDLER来禁用。
使用错误处理器
注册成一个名称为errorHandler,
可以在应用配置中配置它类似如下:
'components' =& [
'errorHandler' =& [
'maxSourceLines' =& 20,
使用如上代码,异常页面最多显示20条源代码。
如前所述,错误处理器将所有非致命PHP错误转换成可获取异常,
也就是说可以使用如下代码处理PHP错误:
use yii\base\ErrorException;
} catch (ErrorException $e) {
Yii::warning("Division by zero.");
如果你想显示一个错误页面告诉用户请求是无效的或无法处理的,
可简单地抛出一个 异常,如 。
错误处理器会正确地设置响应的HTTP状态码并使用合适的错误视图页面来显示错误信息。
use yii\web\NotFoundHttpException;
throw new NotFoundHttpException();
自定义错误显示
错误处理器根据常量
YII_DEBUG的值来调整错误显示,当YII_DEBUG 为 true (表示在调试模式),
错误处理器会显示异常以及详细的函数调用栈和源代码行数来帮助调试,
当YII_DEBUG 为 false,只有错误信息会被显示以防止应用的敏感信息泄漏。
错误处理器默认使用两个显示错误:
@yii/views/errorHandler/error.php: 显示不包含函数调用栈信息的错误信息是使用,
当YII_DEBUG 为 false时,所有错误都使用该视图。
@yii/views/errorHandler/exception.php: 显示包含函数调用栈信息的错误信息时使用。
可以配置错误处理器的
使用自定义的错误显示视图。
使用错误动作
使用指定的错误 来自定义错误显示更方便,
为此,首先配置errorHandler组件的
类似如下:
'components' =& [
'errorHandler' =& [
'errorAction' =& 'site/error',
到一个动作,
上述配置表示不用显示函数调用栈信息的错误会通过执行site/error动作来显示。
可以创建 site/error 动作如下所示:
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
public function actions()
'error' =& [
'class' =& 'yii\web\ErrorAction',
上述代码定义 error 动作使用
该类渲染名为error视图来显示错误。
除了使用, 可定义error 动作使用类似如下的操作方法:
public function actionError()
$exception = Yii::$app-&errorHandler-&
if ($exception !== null) {
return $this-&render('error', ['exception' =& $exception]);
现在应创建一个视图文件为views/site/error.php,在该视图文件中,如果错误动作定义为,
可以访问该动作中定义的如下变量:
name: 错误名称
message: 错误信息
exception: 更多详细信息的异常对象,如HTTP 状态码,错误码,
错误调用栈等。
Note: If you need to redirect in an error handler, do it the following way:
Yii::$app-&getResponse()-&redirect($url)-&send();
自定义错误格式
错误处理器根据设置的格式来显示错误,
如果 响应格式为html,
会使用错误或异常视图来显示错误信息,如上一小节所述。
对于其他的响应格式,错误处理器会错误信息作为数组赋值给属性,
然后转换到对应的格式,
例如,如果响应格式为json,可以看到如下响应信息:
HTTP/1.1 404 Not Found
Date: Sun, 02 Mar :43 GMT
Server: Apache/2.2.26 (Unix) D***/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/ charset=UTF-8
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
可在应用配置中响应response组件的beforeSend
事件来自定义错误响应格式。
'components' =& [
'response' =& [
'class' =& 'yii\web\Response',
'on beforeSend' =& function ($event) {
$response = $event-&
if ($response-&data !== null) {
$response-&data = [
'success' =& $response-&isSuccessful,
'data' =& $response-&data,
$response-&statusCode = 200;
上述代码会重新格式化错误响应,类似如下:
HTTP/1.1 200 OK
Date: Sun, 02 Mar :43 GMT
Server: Apache/2.2.26 (Unix) D***/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/ charset=UTF-8
"success": false,
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404