laravel开发大型电商网站之异常设计思路分析

使人讨厌的异常

提起异常,你们都很反感,当信心满满的写完一段代码,刷新页面发现上面写着大大的 Exception 是最心烦的时候了。模块给领导演示的时候,若是报了异常,也是最让人崩溃的时候了。后端

在通常的大型网站中,若是拥有异常处理的机制,那么将会帮助咱们节省不少不须要的工做,具体以下:网络

什么是异常

  异常是运行中超出了你程序预期的一个东西。编辑器

场景

例如京东有个 轻松购 的功能,当点击的时候会将该商品自动添加到购物车并生成订单,而后进行支付,这是一个网络请求,可是在后端实际执行了一系列的事情(如下操做是简单举例子便于说明问题,和真实步骤有差别)网站

  1. 验证用户是否登陆
  2. 验证用户状态(若是被拉入系统黑名单就不能登陆)
  3. 查看订单中物品是否实时有货
  4. 锁订货物(库存减小,支付中的货物数量 + 1)
  5. 生成订单

问题

步骤不少,若是任何一个环节出现问题,就要作响应的处理code

  1. 用户没有登陆就要保存购买信息,并跳转到登陆页面
  2. 用户状态有问题则直接提示禁止继续购买
  3. 若是没有货物则跳转商品页面
  4. 同时购买人太多,本身购买时无货

处理思路

  1. 写到一个 controller 里面,顺序执行,哪一步出错直接 return ? 这个 controller 该有多长,代码彻底不可读,这是典型面向过程了。
  2. 封装几个业务方法返回 true false 判断?比第一个好,可是就像编辑器多了折叠功能,其实仍是面向过程的思路。

其实咱们能够定义一个  购买流程的类 和一些异常了。下面是每一个步骤的分析中间件

  1. 须要在中间件验证用户是否登陆,直接跳转。
  2. 能够写个中间件,命名为 BlacklistMiddleware 专门处理黑名单,也是直接跳转到禁止界面。
  3. 此时其实已经到咱们的业务处理类里面了,若是无货,你还会写跳转到无货页面吗?显然这里不合适了,由于你不知道何时需求变动(能够继续购买,只不过等待到货而已),若是真的跟需求变动来回改核心代码,累死也写不完程序了。建一个 NoGoodsException 异常,当你业务处理类发现没有货,直接抛出该异常。而后在控制器中 try catch 捕获该异常进行后续处理,或者使用 App\Exceptions\Handler 进行统一处理。
  4. 若是你定义了上面的异常,那么你就尽情的抛出异常吧,已经有异常程序帮你处理后面的事情。

这样的好处就是,你的逻辑彻底分离,不要再在业务逻辑代码里面考虑如何返回什么页面,要跳转到哪里,只考虑抛出合适的异常便可,简单的能够直接在 App\Exceptions\Handler 定义通用的捕获异常处理方式,这样的表现就很是统一了。若是需求高了,能够 try catch 后再根据状况再抛更详细的异常。blog

 

 

 

记录异常

对于某些异常,咱们可能须要记录下来,以便方便发现问题,在 App\Exceptions\Handler 咱们能够不去记录一些异常get

 

 最后针对不一样的异常错误,能够作到相关信息记录,而咱们只须要根据对应的分类找到对应的类库就能够源码

若是有实现疑问或者须要代码笔记,能够加入qq群交流与获取源码笔记:647617935io

相关文章
相关标签/搜索