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 相关文章推荐
Windows中安装Apache2和PHP4权威指南
Nov 18 PHP
php程序之die调试法 快速解决错误
Sep 17 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
php 解压rar文件及zip文件的方法
May 05 PHP
php出现内存位置访问无效错误问题解决方法
Aug 16 PHP
Linux下编译redis和phpredis的方法
Apr 07 PHP
PHP在线调试执行的实现方法(附demo源码)
Apr 28 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
php实现保存周期为1天的购物车类
Jul 07 PHP
php图片合成方法(多张图片合成一张)
Nov 25 PHP
Laravel框架实现抢红包功能示例
Oct 31 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上传文件中文文件名乱码的解决方法
2013/11/01 PHP
浅析PHP的静态成员函数效率更高的原因
2014/06/13 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
javascript 显示当前系统时间代码
2009/12/28 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
详解redis在nodejs中的应用
2018/05/02 NodeJs
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
koa2 从入门到精通(小结)
2019/07/23 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
python 排列组合之itertools
2013/03/20 Python
python获取标准北京时间的方法
2015/03/24 Python
Python线程创建和终止实例代码
2018/01/20 Python
Python基于当前时间批量创建文件
2020/05/07 Python
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
护理专业学生的求职信范文
2013/12/11 职场文书
大学生村官任职感言
2014/01/09 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
小学教师教学反思
2016/02/24 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python