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 相关文章推荐
第二节 对象模型 [2]
Oct 09 PHP
配置最新的PHP加MYSQL服务器
Oct 09 PHP
PHP文件上传实例详解!!!
Jan 02 PHP
PHP中Date()时间日期函数的使用方法小结
Apr 20 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
php Imagick获取图片RGB颜色值
Jul 28 PHP
jquery+thinkphp实现跨域抓取数据的方法
Oct 15 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
在 Laravel 6 中缓存数据库查询结果的方法
Dec 11 PHP
PHP数组基本用法与知识点总结
Jun 02 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 socket 模拟POST 请求实例代码
2016/07/18 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
动态为事件添加js代码示例
2009/02/15 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
JS中Location使用详解
2015/05/12 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
新手该如何学python怎么学好python?
2008/10/07 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
PyQt5实现简易计算器
2020/05/30 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
Python 求向量的余弦值操作
2021/03/04 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
全球最大化妆品零售网站:SkinStore
2020/10/24 全球购物
迎八一活动主题
2014/01/31 职场文书
博士生专家推荐信
2014/09/26 职场文书
政审证明范文
2015/06/19 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书