时间:2021-05-25
首先,我们必须理性认识到,任何一个即使稳定的系统中也是存在着大量的 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 全局异常处理内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文讲述了yii2高级应用之自定义组件实现全局使用图片上传功能的方法。分享给大家供大家参考,具体如下:此例为yii2高组应用,这里只提供一个简单的事例在yii2
最近一直忙其它的(其实是懒!),将《深入理解Yii2》看了一遍,一些当初没明白的稍微明了了点,然后又看yii2的图片上传等处理、富文本、restful什么的,但
本文首先将会回顾Spring5之前的SpringMVC异常处理机制,然后主要讲解SpringBoot2Webflux的全局异常处理机制。SpringMVC的异常
yii2框架是yii的升级版本,本文我们分别讲解在yii框架中如何连接数据库mongodb。在文件夹common/config/main_local.php中加
本文实例讲述了Yii2框架中日志的使用方法。分享给大家供大家参考,具体如下:Yii2和Yii1.x的区别Yii2里面日志的使用方法和Yii1.x并不相同,在Yi