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与SQL注入攻击[一]
Apr 17 PHP
Zend的MVC机制使用分析(一)
May 02 PHP
使用php判断网页是否gzip压缩
Jun 25 PHP
php header功能的使用
Oct 28 PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
Aug 12 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
PHP+Ajax实现的博客文章添加类别功能示例
Mar 29 PHP
laravel 框架配置404等异常页面
Jan 07 PHP
phpquery中文手册
Mar 18 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 filter_var() 函数 Filter 函数
2012/04/25 PHP
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
如何用php获取文件名后缀
2013/06/09 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
基于php实现的验证码小程序
2016/12/13 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
Python实现身份证号码解析
2015/09/01 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
python中web框架的自定义创建
2019/09/08 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
环境科学专业个人求职信
2013/09/26 职场文书
考核工作实施方案
2014/03/30 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
项目转让协议书
2014/10/27 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书
python实现过滤敏感词
2021/05/08 Python
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
Golang jwt身份认证
2022/04/20 Golang