YII2全局异常处理的示例分析
这篇文章主要介绍了YII2全局异常处理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
首先,我们必须理性认识到,任何一个即使稳定的系统中也是存在着大量的 bug,不管是因为什么原因导致的错误,我们都是需要做好防范的,最好的结果当然是将异常纠正过来,返回客户端一个正确的响应结果,但绝大多数情况下是没办法返回正常结果的,只能返回一个客户端一个异常的信息。处理异常的方式,通常分为:
记录日志
修复异常
返回客户端错误
要处理好这个问题,我认为比较简单的方式就是将需要处理的异常按照场景先做一个分类。
常用的处理是: 用户行为导致的错误通常不需要记录日志,因为若是多人使用的情况下会导致日志量过大,但需要向客户端返回具体原因以便用户用正确的方式调用我们的接口;而服务器出现的错误则需要记录日志,因为我们是需要解决这些错误的,记录日志让我们比较方便的找到错误的原因,快速解决,但不向客户端返回具体原因,因为用户没办法通过自己的行为使异常不再出现。当然我们也可以根据自己的业务决定自己的异常处理方式。
在 ThinkPHP 或者其他框架中,如果出现异常,则会出现框架的一个异常页面。
但如果我们开发的是 API,直接返回一个页面给客户端显然不合理,因为别人在使用你的接口的时候还需要解析界面分析出结果,这么做是十分不合理的,所以,我们需要对框架的异常处理进行重写。以下使用 Yii2 框架作为例子讲解重写的逻辑:
首先,我们需要找到 Yii 框架异常处理的设置(../config/web.php)
'components'=>[ 'errorHandler'=>[ 'errorAction'=>'site/error', 'class'=>'app\common\ExceptionHandler',//(这里配置我们自己写的异常处理方法) ],
为了让我们的程序可以简单的辨别出客户的不当调用导致的错误和服务器的错误,我们可以写一个客户的异常类。新建 common\UserException.php 文件
classUserExceptionextendsException { //HTTP状态码404,200 /** *@varint|mixed */ public$code=400; //错误具体信息 /** *@varmixed|string */ public$msg='参数错误'; //自定义的错误码 /** *@varint|mixed */ public$errorCode=10000; /** *UserExceptionconstructor. *@param$params */ publicfunction__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 模式时抛出错误:
关闭 debug 模式,抛出服务器端异常:
publicfunctionactionIndex() { thrownew\Exception(); }
关闭 debug 模式,抛出客户端异常:
publicfunctionactionIndex() { thrownewUserException(); }
感谢你能够认真阅读完这篇文章,希望小编分享的“YII2全局异常处理的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持恰卡编程网,关注恰卡编程网行业资讯频道,更多相关知识等着你来学习!
推荐阅读
-
怎么在Yii2中实现关联查询
今天就跟大家聊聊有关怎么在Yii2中实现关联查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据...
-
怎么在YII2框架中利用UEditor编辑器发布文章
今天就跟大家聊聊有关怎么在YII2框架中利用UEditor编辑器发布文章,可能很多人都不太了解,为了让大家更加了解,小编给大家总结...
-
如何在YII2框架中使用behavior
本篇文章给大家分享的是有关如何在YII2框架中使用behavior,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后...
-
怎么在YII2框架中使用RBAC控制模块
这期内容当中小编将会给大家带来有关怎么在YII2框架中使用RBAC控制模块,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇...
-
怎么在YII2框架中使用ActiveDataProvider和GridView
这篇文章给大家介绍怎么在YII2框架中使用ActiveDataProvider和GridView,内容非常详细,感兴趣的小伙伴们可...
-
怎么在YII2框架中使用控制台命令
本篇文章给大家分享的是有关怎么在YII2框架中使用控制台命令,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有...
-
如何在YII2框架中使用Query()查询生成器
这篇文章将为大家详细讲解有关如何在YII2框架中使用Query()查询生成器,文章内容质量较高,因此小编分享给大家做个参考,希望大...