YII2 全局异常处理深入讲解

admin3年前PHP教程28

 

首先,我们必须理性认识到,任何一个即使稳定的系统中也是存在着大量的 bug,不管是因为什么原因导致的错误,我们都是需要做好防范的,最好的结果当然是将异常纠正过来,返回客户端一个正确的响应结果,但绝大多数情况下是没办法返回正常结果的,只能返回一个客户端一个异常的信息。
处理异常的方式,通常分为:
    记录日志修复异常返回客户端错误

要处理好这个问题,我认为比较简单的方式就是将需要处理的异常按照场景先做一个分类。

常用的处理是: 用户行为导致的错误通常不需要记录日志,因为若是多人使用的情况下会导致日志量过大,但需要向客户端返回具体原因以便用户用正确的方式调用我们的接口;而服务器出现的错误则需要记录日志,因为我们是需要解决这些错误的,记录日志让我们比较方便的找到错误的原因,快速解决,但不向客户端返回具体原因,因为用户没办法通过自己的行为使异常不再出现。当然我们也可以根据自己的业务决定自己的异常处理方式。

在 ThinkPHP 或者其他框架中,如果出现异常,则会出现框架的一个异常页面。

但如果我们开发的是 API,直接返回一个页面给客户端显然不合理,因为别人在使用你的接口的时候还需要解析界面分析出结果,这么做是十分不合理的,所以,我们需要对框架的异常处理进行重写。以下使用 Yii2 框架作为例子讲解重写的逻辑:

首先,我们需要找到 Yii 框架异常处理的设置(../config/web.php)

"components" => ["errorHandler" => ["errorAction" => "site/error","class" => "appcommonExceptionHandler",//(这里配置我们自己写的异常处理方法)],

为了让我们的程序可以简单的辨别出客户的不当调用导致的错误和服务器的错误,我们可以写一个客户的异常类。新建 commonUserException.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 的异常处理的渲染是由 vendoryiisoftyii2webErrorHandler.php 中的 renderException 方法渲染的,所以我们开发属于自己的异常处理类的时候可以选择继承该类并重写这个方法。

这就完成了全局的异常处理,让我们看看效果

当我们开启 debug 模式时抛出错误:

关闭 debug 模式,抛出服务器端异常:

public function actionIndex() {throw new Exception();}

关闭 debug 模式,抛出客户端异常:

public function actionIndex(){throw new UserException(); }

到此这篇关于YII2 全局异常处理深入讲解的文章就介绍到这了,更多相关YII2 全局异常处理内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

浅谈PHP性能优化之php.ini配置

目录内存文件上传会话缓冲输出真实路径缓存内存默认设置memory_limit = 128M单个进程可使用的内存最大值,这个值的设定可以从以下几点考虑:应用的类型。如果是内存集中型应用,可增加该值;单个...

江西gpu服务器租用费用跟哪些因素有关

GPU服务器租用费用是一个复杂的问题,因为它涉及到多个因素。下面是一些影响GPU服务器租用费用的因素:GPU型号不同的GPU型号具有不同的性能和价格。更高性能的GPU通常价格更高。例如,NVIDIAT...

国内可以远程登录泰国服务器吗

国内可以远程登录泰国服务器吗?是的,国内可以远程登录泰国服务器。您只需要使用远程桌面协议(RDP)或SSH等远程访问工具来连接到泰国服务器即可。下面是连接到泰国服务器的步骤:获取远程登录凭据:通常情况...

东莞高防服务器专注游戏服务器防护

东莞高防服务器专注游戏服务器防护?东莞高防服务器专注于游戏服务器防护是一种相对专业的服务,通常针对游戏服务器防护的需求,有以下几个方面的特点和要求:防护能力:游戏服务器面临的攻击形式比较多,例如DDo...

一台韩国服务器能承载多少用户取决哪些因素

一台韩国服务器能承载多少用户取决哪些因素?一台韩国服务器能承载的用户数量取决于多种因素,以下是一些主要因素:服务器硬件配置:服务器的处理器、内存和硬盘空间等硬件配置越高,服务器就能够处理更多的请求和流...

spss数据分析(数据分析需要学哪些)

spss数据分析SPSS全称为「社会科学统计软件包」,是IBM公司推出的一系列用于统计学剖析运算、数据挖掘、预测剖析和决议计划支持任务的软件产品及相关服务的总称。图中我们看到SPSS有23个方法模块,...