YII2 全局异常处理深入讲解

 更新时间:2021年03月19日 17:18:39   作者:若轩啊  
这篇文章主要介绍了YII2 全局异常处理深入讲解,文中列举了异常处理的实例,有感兴趣的同学可以学习下

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

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

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

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

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

但如果我们开发的是 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 模式时抛出错误:

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

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

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

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

到此这篇关于YII2 全局异常处理深入讲解的文章就介绍到这了,更多相关YII2 全局异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP解码unicode编码的中文字符代码分享

    PHP解码unicode编码的中文字符代码分享

    晚上在抓取某网站数据,结果在数据包中发现了这么一串编码的数据:"......\u65b0\u6d6a\u5fae\u535a......", 这其实是中文被unicode编码后了的数据,我现在就是想解码出中文来,上度娘搞了半天,试了很多的姿(方)势(法),终于搞定了。
    2014-08-08
  • Yii框架的路由配置方法分析

    Yii框架的路由配置方法分析

    这篇文章主要介绍了Yii框架的路由配置方法,结合实例形式总结分析了Yii框架路由的常见配置与使用操作技巧,需要的朋友可以参考下
    2019-09-09
  • 使用composer安装使用thinkphp6.0框架问题【视频教程】

    使用composer安装使用thinkphp6.0框架问题【视频教程】

    这篇文章主要介绍了使用composer安装使用thinkphp6.0框架问题,通过一个小视频给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • TP5框架实现签到功能的方法分析

    TP5框架实现签到功能的方法分析

    这篇文章主要介绍了TP5框架实现签到功能的方法,结合实例形式分析了TP5框架实现签到功能相关数据表建立、以及数据的查询、判断、写入等相关操作技巧,需要的朋友可以参考下
    2020-04-04
  • PHP下用Swoole实现Actor并发模型的方法

    PHP下用Swoole实现Actor并发模型的方法

    这篇文章主要介绍了PHP下用Swoole实现Actor并发模型的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • PHP使用php-resque库配合Redis实现MQ消息队列的教程

    PHP使用php-resque库配合Redis实现MQ消息队列的教程

    这篇文章主要介绍了PHP使用php-resque库配合Redis实现MQ消息队列的教程,将展示php-resque的安装部署及一个Worker队列的运行过程,需要的朋友可以参考下
    2016-06-06
  • 使用正则去除php代码中的注释方法

    使用正则去除php代码中的注释方法

    下面小编就为大家带来一篇使用正则去除php代码中的注释方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • php利用header函数下载各种文件

    php利用header函数下载各种文件

    这篇文章主要为大家详细介绍了php利用header函数下载各种文件的代码,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • php 无限级数据JSON格式及JS解析

    php 无限级数据JSON格式及JS解析

    公司要做个Flash效果的页面,需要个无限级树,显示用户邀请的好友及其下线,由此就构成了无限级的关系,可能下线有无限多。
    2010-07-07
  • 深入理解PHP中的count函数

    深入理解PHP中的count函数

    下面小编就为大家带来一篇深入理解PHP中的count函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05

最新评论