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 相关文章推荐
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
用php实现批量查询清除一句话后门的代码
Jan 20 PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
Apr 24 PHP
ThinkPHP模板比较标签用法详解
Jun 30 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
php验证码生成代码
Nov 11 PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
PHP匿名函数和use子句用法实例
Mar 16 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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
JavaScript 撑出页面文字换行
2009/06/15 Javascript
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
图解js图片轮播效果
2015/12/20 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
python运行时强制刷新缓冲区的方法
2019/01/14 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
医学护理系毕业生求职信
2013/10/01 职场文书
业务员岗位职责范本
2013/12/15 职场文书
考试作弊被抓检讨书
2014/01/10 职场文书
新年爱情寄语
2014/04/08 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
高中运动会广播稿
2014/09/16 职场文书
员工离职感谢信
2015/01/22 职场文书
小学见习报告
2015/06/23 职场文书
老人节主持词
2015/07/04 职场文书
六一亲子活动感想
2015/08/07 职场文书
php实现自动生成验证码的实例讲解
2021/11/17 PHP
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android