YII2 全局异常处理深入讲解


Posted in PHP onMarch 24, 2021

首先,我们必须理性认识到,任何一个即使稳定的系统中也是存在着大量的 bug,不管是因为什么原因导致的错误,我们都是需要做好防范的,最好的结果当然是将异常纠正过来,返回客户端一个正确的响应结果,但绝大多数情况下是没办法返回正常结果的,只能返回一个客户端一个异常的信息。
处理异常的方式,通常分为:

  1. 记录日志
  2. 修复异常
  3. 返回客户端错误

要处理好这个问题,我认为比较简单的方式就是将需要处理的异常按照场景先做一个分类。

YII2 全局异常处理深入讲解

常用的处理是: 用户行为导致的错误通常不需要记录日志,因为若是多人使用的情况下会导致日志量过大,但需要向客户端返回具体原因以便用户用正确的方式调用我们的接口;而服务器出现的错误则需要记录日志,因为我们是需要解决这些错误的,记录日志让我们比较方便的找到错误的原因,快速解决,但不向客户端返回具体原因,因为用户没办法通过自己的行为使异常不再出现。当然我们也可以根据自己的业务决定自己的异常处理方式。

在 ThinkPHP 或者其他框架中,如果出现异常,则会出现框架的一个异常页面。

YII2 全局异常处理深入讲解

但如果我们开发的是 API,直接返回一个页面给客户端显然不合理,因为别人在使用你的接口的时候还需要解析界面分析出结果,这么做是十分不合理的,所以,我们需要对框架的异常处理进行重写。以下使用 Yii2 框架作为例子讲解重写的逻辑:

首先,我们需要找到 Yii 框架异常处理的设置(../config/web.php)

'components' => [
   'errorHandler' => [
     'errorAction' => 'site/error',
     'class' => 'app\common\ExceptionHandler',//(这里配置我们自己写的异常处理方法)
   ],

为了让我们的程序可以简单的辨别出客户的不当调用导致的错误和服务器的错误,我们可以写一个客户的异常类。新建 common\UserException.php 文件

class UserException extends Exception
{
  // HTTP 状态码 404,200
  /**
   * @var int|mixed
   */
  public $code = 400;
  // 错误具体信息
  /**
   * @var mixed|string
   */
  public $msg = '参数错误';
  // 自定义的错误码
  /**
   * @var int|mixed
   */
  public $errorCode = 10000;
  
  /**
   * UserException constructor.
   * @param $params
   */
  public function __construct($params=[]) {
    // 如果传过来的不是数组则不进行对象初始化
    if (!is_array($params)) {
      return;
    }
    // 判断数组有没有该键值
    if (array_key_exists('code',$params)) {
      $this->code = $params['code'];
    }
    if (array_key_exists('msg',$params)) {
      $this->msg = $params['msg'];
    }
    if (array_key_exists('errorCode',$params)) {
      $this->errorCode = $params['errorCode'];
    }
  }
}

新建 common/ExceptionHandler.php 文件,因为 yii 的异常处理的渲染是由 vendor\yiisoft\yii2\web\ErrorHandler.php 中的 renderException 方法渲染的,所以我们开发属于自己的异常处理类的时候可以选择继承该类并重写这个方法。

这就完成了全局的异常处理,让我们看看效果

当我们开启 debug 模式时抛出错误:

YII2 全局异常处理深入讲解

关闭 debug 模式,抛出服务器端异常:

public function actionIndex()
{
 throw new \Exception();
 
}

YII2 全局异常处理深入讲解

关闭 debug 模式,抛出客户端异常:

public function actionIndex()
{
  throw new UserException();
 
}

YII2 全局异常处理深入讲解

到此这篇关于YII2 全局异常处理深入讲解的文章就介绍到这了。

PHP 相关文章推荐
改进的IP计数器
Oct 09 PHP
php 前一天或后一天的日期
Jun 28 PHP
mysql 性能的检查和优化方法
Jun 21 PHP
Ajax+PHP 边学边练 之二 实例
Nov 24 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
分享PHP header函数使用教程
Sep 05 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
PHP面向对象详解(三)
Dec 07 PHP
laravel学习教程之存取器
Jul 30 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
PHP使用SMTP邮件服务器发送邮件示例
Aug 28 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 #PHP
laravel使用redis队列实例讲解
phpquery中文手册
Mar 18 #PHP
thinkphp5 路由分发原理
Mar 18 #PHP
is_file和file_exists效率比较
Mar 14 #PHP
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
open_basedir restriction in effect. 原因与解决方法
Mar 14 #PHP
You might like
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
php简单获取目录列表的方法
2015/03/24 PHP
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
js实现鼠标单击Tab表单切换效果
2018/05/16 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
Python装饰器decorator用法实例
2014/11/10 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
python设置表格边框的具体方法
2020/07/17 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技