如何在Yii框架中处理错误和异常

最终产品图片
您将要创造的

介绍

在今天的教程中,我将介绍Yii的错误和异常处理,并指导您完成一些介绍性场景。

想知道Yii是什么? 查看我们的Yii框架介绍Yii2编程系列

错误和异常之间有什么区别?

错误是我们的代码中意外的缺陷,通常是用户首先发现的。 他们通常会中断程序执行。 重要的是,不仅要为用户妥善解决问题,还要将问题告知开发人员以便可以解决。

当潜在的可预测错误情况发生时,开发人员会创建异常。 在可能发生异常的代码中,开发人员可以向健壮的错误处理程序抛出()异常。

Yii如何管理这些?

在Yii中,非致命的PHP错误(例如警告和通知)被路由到可捕获的异常中,因此您可以决定如何响应和响应它们。 您可以指定一个控制器动作来处理所有这些异常。 您可以自定义错误的显示格式,例如HTML,JSON,XML等。

只能在调试模式下评估异常和致命的PHP错误。 在这类开发方案中,Yii可以显示详细的调用堆栈信息和源代码段(您可以在标题图像中看到此内容)

致命错误是破坏应用程序执行的事件。 这些包括内存不足,实例化不存在的类的对象或调用不存在的函数。

例如:

$t = new Unknownobject();

让我们开始一些错误和异常处理的例子。

配置错误和异常处理

首先,我们在frontend / config / main.php中配置我们的应用程序。 如下所示,将errorHandler定义为组件。 此示例来自我的启动系列应用程序 Meeting Planner 。 注意componentserrorHandler配置:

<?php
$params = array_merge(
    require(__DIR__ . '/params.php'),
    require(__DIR__ . '/params-local.php')
);
return [
    'id' => 'mp-frontend',
    'name' => 'Meeting Planner',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log','\common\components\SiteHelper'],
    'controllerNamespace' => 'frontend\controllers',
    'catchAll'=> [],
    'components' => [
      'assetManager' => [...],
      ...
      'errorHandler' => [
            'errorAction' => 'site/error',
            'maxSourceLines' => 20,
        ],
        ...
    ],
];

在上面的示例中, errorAction将用户定向到我的SiteController的error操作。

更广泛地说,Yii为errorHandler提供了多种配置选项,用于重定向和数据收集:

属性 类型 描述
$ callStackItemView 用于呈现异常和错误的视图文件的路径调用堆栈元素。 例如'@ yii / views / errorHandler / callStackItem.php'
$ displayVars 数组 应该在错误页面上显示的PHP预定义变量的列表。 例如['_GET','_ POST','_ FILES','_ COOKIE','_ SESSION']
$ errorAction 到控制器操作的路由(例如site/error ),将用于显示外部错误。
$ errorView 视图文件的路径,用于呈现没有调用堆栈信息的异常。 例如'@ yii / views / errorHandler / error.php'
$ exceptionView 用于呈现异常的视图文件的路径。 例如'@ yii / views / errorHandler / exception.php'
$ maxSourceLines 整数 要显示的最大源代码行数。
$ maxTraceSourceLines 整数 要显示的跟踪源代码行的最大数量。
$ previousExceptionView 用于呈现先前异常的视图文件的路径。 例如'@ yii / views / errorHandler / previousException.php'

使用errorActions直接执行

通常,当用户遇到严重错误时,我们希望将其重定向到友好的描述性错误页面。

这就是errorHandler中的errorAction所做的。 它将重定向到我们的SiteController的actionError:

return [
    'components' => [
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
    ]
];

在我们的SiteController中,我们定义了一个明确的error操作:

namespace app\controllers;

use Yii;
use yii\web\Controller;

class SiteController extends Controller
{
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }
}

这是一个基本的错误处理程序(您可以在此处阅读有关这些内容的更多信息 ):

public function actionError()
{
    $exception = Yii::$app->errorHandler->exception;
    if ($exception !== null) {
        return $this->render('error', ['exception' => $exception]);
    }
}

您还可以以不同的方式响应您的应用程序中是否存在错误或页面请求:

public function actionError()
    {
        $exception = Yii::$app->errorHandler->exception;
        if ($exception instanceof \yii\web\NotFoundHttpException) {
            // all non existing controllers+actions will end up here
            return $this->render('pnf'); // page not found
        } else {
          return $this->render('error', ['exception' => $exception]);
        }
    }

这是我当前的Page Not Found 404错误处理程序:

Yii2错误处理和异常404页面未找到错误

从理论上讲,您可以在错误页面上包含链接的站点地图,与页面请求类似的建议页面,搜索功能以及联系人支持链接。 所有这些都可以帮助用户恢复健康并继续前进。

这是我当前的一般错误页面(显然我要添加一些功能)

Yii2错误处理和异常典型页面错误

捕捉异常

如果要监视一段代码中的问题,可以使用PHP try catch block 。 下面,我们将通过触发致命除数为零的错误进行实验:

use Yii;
use yii\base\ErrorException;

...

    try {
        10/0;
    } catch (ErrorException $e) {
        Yii::warning("Division by zero.");
    }
    
...

上面的catch响应是为日志生成警告。 Yii拥有广泛的日志记录

如果您希望将用户定向到我们之前配置的错误页面,而不是记录事件,则可以引发事件异常:

use yii\web\NotFoundHttpException;

throw new NotFoundHttpException();

这是一个示例,其中我们抛出带有特定HTTP状态代码和自定义消息的异常:

try {
          10/0;
      } catch (ErrorException $e) {
        throw new \yii\web\HttpException(451,
            'Tom McFarlin\'s humor is often lost on me
                (and lots of people).');
    }

这是用户看到的代码:

Yii2错误处理和异常引发异常

关于Yii日志记录

收盘时

希望您喜欢我们对错误和异常处理的探索。 在继续研究框架的不同方面时,请观看我们的《 使用Yii2编程》系列中即将发布的教程。

如果您想深入了解Yii应用程序开发,请查看我们的使用Yii2的高级模板使用PHP构建您的启动系列 。 它讲述了对Meeting Planner的每个步骤进行编程的故事。 如果您想从头开始学习在Yii中构建应用程序,这将非常有用。

如果您想知道下一个Yii2教程何时到达, 在Twitter上关注我@lookahead_io查看我的讲师页面

相关链接

翻译自: https://code.tutsplus.com/tutorials/how-to-handle-errors-exceptions-in-the-yii-framework--cms-28531

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值