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中date()得出的时间为什么不是当前时间的解决方法
Jun 30 PHP
php URL跳转代码 减少外链
Jun 25 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
Aug 09 PHP
关于PHP的curl开启问题探讨
Apr 08 PHP
PHP中数组的分组排序实例
Jun 01 PHP
php将csv文件导入到mysql数据库的方法
Dec 24 PHP
基于php的微信公众平台开发入门实例
Apr 15 PHP
四个PHP非常实用的功能
Sep 29 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
Aug 12 PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 PHP
解决Laravel无法使用COOKIE和SESSION的问题
Oct 16 PHP
php修改word的实例方法
Nov 17 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
PHP 中的类
2006/10/09 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
图片自动更新(说明)
2006/10/02 Javascript
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
管理科学大学生求职信
2013/11/13 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
2014年营业员工作总结
2014/11/18 职场文书
党员自我评价2015
2015/03/03 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript