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 不错的学习资料
Feb 06 PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
php中session退出登陆问题
Feb 27 PHP
yii框架builder、update、delete使用方法
Apr 30 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
Apr 15 PHP
php常用表单验证类用法实例
Jun 18 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
PHP控制前台弹出对话框的实现方法
Aug 21 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无限级分类方法及代码
2013/06/21 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
零基础学JavaScript最新动画教程+iso光盘下载
2008/01/22 Javascript
javascript 写类方式之一
2009/07/05 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
介绍Python中的__future__模块
2015/04/27 Python
Python中Class类用法实例分析
2015/11/12 Python
python处理html转义字符的方法详解
2016/07/01 Python
详解python之简单主机批量管理工具
2017/01/27 Python
简单实现python收发邮件功能
2018/01/05 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
python调用staf自动化框架的方法
2018/12/26 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
人力资源主管的岗位职责
2014/03/15 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书