简介
在今天的教程中,我将介绍 Yii 的错误和异常处理,并指导您完成一些介绍性场景。
想知道 Yii 是什么?查看我们的 Yii 框架简介和 Yii2 编程系列。
错误和异常之间有什么区别?
错误是我们代码中的意外缺陷,通常由用户首先发现。它们通常会中断程序的执行。重要的是,不仅要为用户优雅地中断,还要将问题告知开发人员,以便解决问题。
当发生潜在的可预测错误情况时,开发人员会创建异常。在可能发生异常的代码中,开发人员可以向健壮的错误处理程序抛出()异常。
Yii 如何管理这些?
在 Yii 中,非致命 PHP 错误(例如警告和通知)被路由到可捕获的异常中,以便您可以决定如何对它们做出反应和响应。您可以指定一个控制器操作来处理所有这些异常。您还可以自定义错误的显示格式,例如HTML、JSON、XML 等
异常和致命 PHP 错误只能在调试模式下评估。在这些类型的开发场景中,Yii 可以显示详细的调用堆栈信息和源代码片段(您可以在上面的标题图片中看到这一点)。
致命错误是中断应用程序执行的事件类型。其中包括内存不足、实例化不存在的类的对象或调用不存在的函数。
例如:
$t = new Unknownobject();
让我们开始看一些错误和异常处理的示例。
配置错误和异常处理
首先,我们在 frontend/config/main.php 中配置我们的应用程序。 errorHandler 被定义为一个组件,如下所示。此示例来自我的启动系列应用程序 Meeting Planner。请注意 errorHandler
在 components
中的配置:
<?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
提供了多种配置选项,用于重定向和数据收集:
属性 | 类型 | 描述 |
---|---|---|
$callStackItemView | 字符串 | 用于渲染异常和错误调用堆栈元素的视图文件的路径。例如'@yii/views/errorHandler/callStackItem.php' |
$displayVars | 数组 | 应显示在错误页面上的 PHP 预定义变量列表。例如['_GET'、'_POST'、'_FILES'、'_COOKIE'、'_SESSION'] |
$errorAction | 字符串 | 用于显示外部错误的控制器操作的路由(例如 site/error )。 |
$errorView | 字符串 | 用于渲染没有调用堆栈信息的异常的视图文件的路径。例如'@yii/views/errorHandler/error.php' |
$异常视图 | 字符串 | 渲染异常的视图文件的路径。例如'@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 错误处理程序:
理论上,您可以包含链接的站点地图、与页面请求类似的建议页面、搜索功能和联系支持错误页面上的链接。所有这些都可以帮助用户恢复并优雅地继续前进。
这是我当前的一般错误页面(显然我需要添加功能):
捕获异常
如果我们想要监视一段代码是否存在问题,我们可以使用 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 的 Sentry 和 Rollbar 的教程感兴趣:
-
构建您的初创公司:错误日志
结束时
我希望您喜欢我们对错误和异常处理的探索。请关注我们的“使用 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中文网其他相关文章!

phpsessionstrackuserdataacrossmultiplepagerequestsusingauniqueIdStoredInacookie.here'showtomanageThemeffectionaly:1)startAsessionWithSessionwwithSession_start()和stordoredAtain $ _session.2)

在PHP中,遍历会话数据可以通过以下步骤实现:1.使用session_start()启动会话。2.通过foreach循环遍历$_SESSION数组中的所有键值对。3.处理复杂数据结构时,使用is_array()或is_object()函数,并用print_r()输出详细信息。4.优化遍历时,可采用分页处理,避免一次性处理大量数据。这将帮助你在实际项目中更有效地管理和使用PHP会话数据。

会话通过服务器端的状态管理机制实现用户认证。1)会话创建并生成唯一ID,2)ID通过cookies传递,3)服务器存储并通过ID访问会话数据,4)实现用户认证和状态管理,提升应用安全性和用户体验。

Tostoreauser'snameinaPHPsession,startthesessionwithsession_start(),thenassignthenameto$_SESSION['username'].1)Usesession_start()toinitializethesession.2)Assigntheuser'snameto$_SESSION['username'].Thisallowsyoutoaccessthenameacrossmultiplepages,enhanc

PHPSession失效的原因包括配置错误、Cookie问题和Session过期。1.配置错误:检查并设置正确的session.save_path。2.Cookie问题:确保Cookie设置正确。3.Session过期:调整session.gc_maxlifetime值以延长会话时间。

在PHP中调试会话问题的方法包括:1.检查会话是否正确启动;2.验证会话ID的传递;3.检查会话数据的存储和读取;4.查看服务器配置。通过输出会话ID和数据、查看会话文件内容等方法,可以有效诊断和解决会话相关的问题。

多次调用session_start()会导致警告信息和可能的数据覆盖。1)PHP会发出警告,提示session已启动。2)可能导致session数据意外覆盖。3)使用session_status()检查session状态,避免重复调用。

在PHP中配置会话生命周期可以通过设置session.gc_maxlifetime和session.cookie_lifetime来实现。1)session.gc_maxlifetime控制服务器端会话数据的存活时间,2)session.cookie_lifetime控制客户端cookie的生命周期,设置为0时cookie在浏览器关闭时过期。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具