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&&mysql)五
Oct 09 PHP
一个取得文件扩展名的函数
Oct 09 PHP
PHP简洁函数(PHP简单明了函数语法)
Jun 10 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
有关于PHP中常见数据类型的汇总分享
Jan 06 PHP
php获取根域名方法汇总
Oct 28 PHP
twig里使用js变量的方法
Feb 05 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
php禁用函数设置及查看方法详解
Jul 25 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
Dec 28 PHP
PHP通过GD库实现验证码功能示例
Feb 23 PHP
如何使用php生成zip压缩包
Apr 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
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
用jscript实现新建word文档
2007/06/15 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
浅析Vue中method与computed的区别
2018/03/06 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
跟老齐学Python之类的细节
2014/10/13 Python
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
Python全局变量用法实例分析
2016/07/19 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
python模块常用用法实例详解
2019/10/17 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
新手学python应该下哪个版本
2020/06/11 Python
PyCharm+Miniconda3安装配置教程详解
2021/02/16 Python
CSS3 实现弹幕的示例代码
2017/08/07 HTML / CSS
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
关于军训的感想
2015/08/07 职场文书