首頁 >後端開發 >php教程 >處理 Yii 框架中的錯誤和異常:綜合指南

處理 Yii 框架中的錯誤和異常:綜合指南

王林
王林原創
2023-09-02 15:17:01804瀏覽

处理 Yii 框架中的错误和异常:综合指南

#簡介

在今天的教學中,我將介紹 Yii 的錯誤和異常處理,並引導您完成一些介紹性場景。

想知道 Yii 是什麼?查看我們的 Yii 框架簡介和 Yii2 程式設計系列。

錯誤和異常有什麼差別?

錯誤是我們程式碼中的意外缺陷,通常由使用者先發現。它們通常會中斷程式的執行。重要的是,不僅要為使用者優雅地中斷,還要將問題告知開發人員,以便解決問題。

當發生潛在的可預測錯誤情況時,開發人員會建立異常。在可能發生異常的程式碼中,開發人員可以向健壯的錯誤處理程序拋出()異常。

#Yii 如何管理這些?

在 Yii 中,非致命 PHP 錯誤(例如警告和通知)被路由到可捕獲的異常中,以便您可以決定如何對它們做出反應和回應。您可以指定一個控制器操作來處理所有這些異常。您也可以自訂錯誤的顯示格式,例如HTML、JSON、XML 等

異常和致命 PHP 錯誤只能在偵錯模式下評估。在這些類型的開發場景中,Yii 可以顯示詳細的呼叫堆疊資訊和原始碼片段(您可以在上面的標題圖片中看到這一點)

致命錯誤是中斷應用程式執行的事件類型。其中包括記憶體不足、實例化不存在的類別的物件或呼叫不存在的函數。

例如:

$t = new Unknownobject();

讓我們開始看一些錯誤和異常處理的範例。

配置錯誤和異常處理

首先,我們在 frontend/config/main.php 中設定我們的應用程式。 errorHandler 被定義為一個元件,如下所示。此範例來自我的啟動系列應用程式 Meeting Planner。請注意 errorHandlercomponents 中的配置:

<?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 的錯誤動作。

更廣泛地說,Yii 為 errorHandler 提供了多種配置選項,用於重定向和資料收集:

應顯示在錯誤頁面上的 PHP 預先定義變數清單。例如['_GET'、'_POST'、'_FILES'、'_COOKIE'、'_SESSION']site/error)。 用於渲染沒有呼叫堆疊資訊的異常的視圖檔案的路徑。例如'@yii/views/errorHandler/error.php'渲染異常的視圖檔案的路徑。例如'@yii/views/errorHandler/exception.php'要顯示的最大原始碼行數。 要顯示的最大追蹤原始碼行數。 用於渲染先前異常的視圖檔案的路徑。例如'@yii/views/errorHandler/previousException.php'
屬性 類型 描述
$callStackItemView ##字串 用於渲染異常和錯誤調用堆疊元素的視圖檔案的路徑。例如'@yii/views/errorHandler/callStackItem.php'
$displayVars 陣列
$errorAction 字串 用於顯示外部錯誤的控制器操作的路由(例如
$errorView #字串
$異常視圖 字串
$maxSourceLines 整數
$maxTraceSourceLines 整數
$previousExceptionView ##字串
######

使用 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 错误处理程序:

处理 Yii 框架中的错误和异常:综合指南

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

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

处理 Yii 框架中的错误和异常:综合指南

捕获异常

如果我们想要监视一段代码是否存在问题,我们可以使用 PHP try catch 块。下面,我们将通过触发致命除以零错误进行实验:

use Yii;
use yii\base\ErrorException;

...

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

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

  • Yii::trace():记录一条消息以跟踪一段代码的运行情况。主要用于开发。
  • Yii::info():记录一条消息,传达有关事件的信息。
  • Yii::warning():记录发生意外事件的警告消息
  • Yii::error():记录一个致命错误以供调查

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

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).');
    }

对于用户来说,该代码如下所示:

处理 Yii 框架中的错误和异常:综合指南

关于 Yii 日志记录

Yii 中的所有错误都会根据您的设置方式进行记录。您可能还对我有关用于登录 Yii 的 Sentry 和 Rollbar 的教程感兴趣:

  • 处理 Yii 框架中的错误和异常:综合指南

    构建您的初创公司:错误日志

    处理 Yii 框架中的错误和异常:综合指南

Yii

结束时

我希望您喜欢我们对错误和异常处理的探索。请关注我们的“使用 Yii2 编程”系列中即将推出的教程,我们将继续深入探讨该框架的不同方面。

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

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

相关链接

  • yii\web\ErrorHandler 文档
  • 处理错误(Yii 2.0 权威指南)
  • 日志记录(Yii 2.0 权威指南)
  • Yii2 Developer Exchange(作者的资源网站)

以上是處理 Yii 框架中的錯誤和異常:綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn