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 相关文章推荐
php5 pdo新改动加载注意事项
Sep 11 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
php使用正则表达式进行字符串搜索的方法
Mar 23 PHP
PHP实现简单汉字验证码
Jul 28 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
PHP生成及获取JSON文件的方法
Aug 23 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 PHP
Laravel 实现关系模型取出需要的字段
Oct 10 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 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利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
python删除列表中重复记录的方法
2015/04/28 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
python字符串与url编码的转换实例
2018/05/10 Python
python读取LMDB中图像的方法
2018/07/02 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
python数据类型强制转换实例详解
2020/06/22 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
请解释在new与override的区别
2012/10/29 面试题
.NET remoting中对象激活的两种方式
2015/06/08 面试题
接口可以包含哪些成员
2012/09/30 面试题
初中生学习生活的自我评价
2013/11/20 职场文书
教师个人自我评价范文
2014/04/13 职场文书
初二学习计划书范文
2014/04/27 职场文书
质量月活动总结
2014/08/26 职场文书
宣传稿格式范文
2015/07/23 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
Python学习之时间包使用教程详解
2022/03/21 Python