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 相关文章推荐
一个连接两个不同MYSQL数据库的PHP程序
Oct 09 PHP
推荐php模板技术[转]
Jan 04 PHP
PHP 读取文件的正确方法
Apr 29 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
Jun 26 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 PHP
PHP实现Google plus的好友拖拽分组效果
Oct 21 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
php字符串过滤strip_tags()函数用法实例分析
Jun 24 PHP
PHP 99乘法表的几种实现代码
Oct 13 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去除二维数组的重复项方法
2015/11/04 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
2015/11/17 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
调试Python程序代码的几种方法总结
2015/04/28 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
超市中秋节活动方案
2014/02/12 职场文书
绿色学校实施方案
2014/03/31 职场文书
英文辞职信范文
2015/05/13 职场文书
清明节随笔
2015/08/15 职场文书
初二英语教学反思
2016/02/15 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript