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 相关文章推荐
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
Jul 28 PHP
PHP解析目录路径的3个函数总结
Nov 18 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
实现PHP搜索加分页
Oct 12 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
PHP+MySQL实现消息队列的方法分析
May 09 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
Feb 27 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
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
CURL状态码列表(详细)
2013/06/27 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
php递归函数怎么用才有效
2018/02/24 PHP
csdn 博客的css样式 v3
2009/02/24 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
python基础之入门必看操作
2017/07/26 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
python学习笔记之多进程
2020/08/06 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
什么造成了Java里面的异常
2016/04/24 面试题
一些Unix笔试题和面试题
2013/01/22 面试题
党员承诺书格式
2014/05/21 职场文书
员工安全生产承诺书
2014/05/22 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
展览会邀请函
2015/02/02 职场文书
安全承诺书格式范本
2015/04/28 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python