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 相关文章推荐
PHP+MySQL5.0中文乱码解决方法
Nov 20 PHP
php中用文本文件做数据库的实现方法
Mar 27 PHP
php mssql 数据库分页SQL语句
Dec 16 PHP
php学习之 循环结构实现代码
Jun 09 PHP
PHP基础陷阱题(变量赋值)
Sep 12 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
ThinkPHP 404页面的设置方法
Jan 14 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
Sep 23 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
php获取开始与结束日期之间所有日期的方法
Nov 29 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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代码保护--Zend Guard的使用详解
2013/06/03 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
Python如何省略括号方法详解
2020/03/21 Python
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
园林设计师自荐信
2013/11/18 职场文书
建筑结构施工求职信
2014/07/11 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
走近毛泽东观后感
2015/06/04 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle