Yii2 在此处记录了自定义错误处理https://www.yiiframework.com/doc/guide/2.0/en/runtime-handling-errors并将错误处理与异常处理分开:
@yii/views/errorHandler/error.php: used when errors should be displayed WITHOUT call stack information. When YII_DEBUG is false, this is the only error view to be displayed. @yii/views/errorHandler/exception.php: used when errors should be displayed WITH call stack information.
但这还不清楚 - 文本表明,error.php 用于生产环境,而 except.php 用于开发/调试环境。
有关方法的进一步建议:
return [
'components' => [
'errorHandler' => [
'errorAction' => 'site/error',
],
]
];
没有考虑到这种差异。
我的 SiteController 有代码:
public function actionError()
{
error_log('actionError happens!');
$exception = Yii::$app->errorHandler->exception;
if ($exception instanceof \yii\web\UnauthorizedHttpException) {
Yii::$app->response->statusCode = 401;
$data = new \stdClass();
$data->error = true;
$data->message = $exception->getMessage();
return json_encode($data);
}
$data = new \stdClass();
$data->error = true;
$data->message = 'An internal error occurred.';
return json_encode($data);
}
注册执行(通过 error_log)并仅以技术格式输出错误,但在某些情况下,当绕过此错误处理时,Yii2 仍然使用 @yii/views/errorHandler/exception.php 进行报告错误。
几乎所有严重异常都以这种方式报告,例如
Throwable... Undefined property: stdClass::$sal_tax
Cannot use object of type stdClass as array
以这种通用方式报告。
我更喜欢自己的自定义错误处理 - 可以注册错误情况并以技术格式输出(这样,我的浏览器端应用程序或移动端应用程序可以对此做一些有意义的事情),但我找不到,如何在这些更严重的情况下覆盖内置的异常处理。它们可能会发生 - PHP 没有进行类型检查。
Yii2 errorHandler(
yii\web\ErrorHandler
和yii\console\ErrorHandler
)是所有类型错误的包装器。如果您查看 PHP 错误和异常的层次结构,那么捕获 throwable
可确保任何类型的错误都由前述
errorHandler
处理。这允许将错误路由到任何
controller/action/view
(或者您甚至可以扩展
errorHandler
对象)并实现您自己的自定义逻辑来处理它:
$exception = Yii::$app->errorHandler->exception
$code = $exception->getCode();
if ($code == E_PARSE) {
// handle parse errors
} elseif ($code == 404) {
// handle page not found exceptions
} else {
// ...
}
请注意,所有 PHP 错误都会转换为 异常对象,您可以使用 $exception->code
或
$exception->severity
来确定错误类型。另请参阅PHP 错误代码。