PHP异常处理那些事( 二 )


文章插图
 
异常之于业务场景
特定一类throwable统一输出json 最后,我们回归到上面最初的代码,如果human的id是非法的,就抛出了异常,假设这个id恰好是业务前端传递的,我们就需要告诉用户这个id是非法的,明确告诉他非法请求. 实现的逻辑代码大致为:

PHP异常处理那些事

文章插图
 
如果这中参数对应的msg想统一起来,且前端提交的参数非常多,都需要这样判断呢? 这里我们可以抽象出有一个类,继承自InvalidArgumentException的类ApiInvalidArgumentException,然后统一在上层捕获这个异常,然后统一输出json格式 这里的最佳实践可以在laravel中看到影子,大致思路如下:
1.继承IlluminateFoundationExceptionsHandler::render($request, Exception $e)
2.ApiInvalidArgumentException类定义toJson方法
3.拿到$e,特判ApiInvalidArgumentException,return出tojson
如此对业务代码无侵入,看起来干净且明了
将没有catch的异常介入第三方统计 线上在所难免的会有一些异常是未捕获的,这时PHP会将信息直接fatal error,并输出堆栈信息,所以我们可以将这些信息介入第三方,实时发消息给开发者,解决和发现线上问题. 推荐大家使用sentry作为PHP异常处理和发现的工具,很强大,目前我们团队线上就在大量使用.
因为我们的业务需要判断和处理太多不符合预期的结果了,有时候一个鲁棒性强的代码可能是核心业务代码的2-3倍,这个时候如果我们能够很好的利用exception,既能让代码健壮,又能让健壮性判断可读性高,例如我们可以二次封装if判断,转变为assert断言,然后在断言中抛出异常.现在很多第三方类库,都很好的定义了自己的异常,为的就是健壮和可读性,希望通过这篇文章,大家能够收获一些新的心得体会,也希望你能斧正文章的错误 。

【PHP异常处理那些事】


推荐阅读