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 相关文章推荐
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
php获取用户IPv4或IPv6地址的代码
Nov 15 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
May 04 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
Oct 24 PHP
php中file_exists函数使用详解
May 08 PHP
PHP程序员不应该忽略的3点
Oct 09 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
PHP中利用sleep函数实现定时执行功能实现代码
Aug 25 PHP
设定php简写功能的方法
Nov 28 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获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
php之XML转数组函数的详解
2013/06/07 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
php构造函数实例讲解
2013/11/13 PHP
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
php HTML无刷新提交表单
2016/04/05 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
详解JavaScript的this指向和绑定
2020/09/08 Javascript
python opencv之SIFT算法示例
2018/02/24 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
小学班主任寄语大全
2014/04/04 职场文书
模特大赛策划方案
2014/05/28 职场文书
作风建设年活动总结
2014/08/27 职场文书
优秀少先队员事迹材料
2014/12/24 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js