首先,我们必需理性认识到,任何一个纵然不变的系统中也是存在着大量的 bug,不管是因为什么原因导致的错误,我们都是需要做好防御的,最好的功效虽然是将异常更正过来,返回客户端一个正确的响应功效,但绝大大都环境下是没步伐返回正常功效的,只能返回一个客户端一个异常的信息。
处理惩罚异常的方法,凡是分为:
记录日志
修复异常
返回客户端错误
要处理惩罚好这个问题,我认为较量简朴的方法就是将需要处理惩罚的异常凭据场景先做一个分类。
常用的处理惩罚是: 用户行为导致的错误凡是不需要记录日志,因为若是多人利用的环境下会导致日志量过大,但需要向客户端返回详细原因以便用户用正确的方法挪用我们的接口;而处事器呈现的错误则需要记录日志,因为我们是需要办理这些错误的,记录日志让我们较量利便的找到错误的原因,快速办理,但不向客户端返回详细原因,因为用户没步伐通过本身的行为使异常不再呈现。虽然我们也可以按照本身的业务抉择本身的异常处理惩罚方法。
在 ThinkPHP 可能其他框架中,假如呈现异常,则会呈现框架的一个异常页面。
但假如我们开拓的是 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 模式时抛堕落误:
封锁 debug 模式,抛出处事器端异常:
public function actionIndex() { throw new \Exception(); }
封锁 debug 模式,抛出客户端异常:
public function actionIndex() { throw new UserException(); }
到此这篇关于YII2 全局异常处理惩罚深入讲授的文章就先容到这了,更多相关YII2 全局异常处理惩罚内容请搜索剧本之家以前的文章或继承欣赏下面的相关文章但愿各人今后多多支持剧本之家!
您大概感乐趣的文章: