zoukankan      html  css  js  c++  java
  • laravel开发大型电商网站之异常设计思路分析

    令人讨厌的异常

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

    在一般的大型网站中,如果拥有异常处理的机制,那么将会帮助我们节省很多不需要的工作,具体如下:

    什么是异常

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

    场景

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

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

    问题

    步骤很多,如果任何一个环节出现问题,就要做响应的处理

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

    处理思路

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

    其实我们可以定义一个  购买流程的类 和一些异常了。下面是每个步骤的分析

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

    这样的好处就是,你的逻辑完全分离,不要再在业务逻辑代码里面考虑如何返回什么页面,要跳转到哪里,只考虑抛出合适的异常即可,简单的可以直接在 AppExceptionsHandler 定义通用的捕获异常处理方式,这样的表现就非常统一了。如果需求高了,可以 try catch 后再根据情况再抛更详细的异常。

    记录异常

    对于某些异常,我们可能需要记录下来,以便方便发现问题,在 AppExceptionsHandler 我们可以不去记录一些异常

     最后针对不同的异常错误,可以做到相关信息记录,而我们只需要根据对应的分类找到对应的类库就可以

    如果有实现疑问或者需要代码笔记,可以加入qq群交流与获取源码笔记:647617935

  • 相关阅读:
    将DotNetBar添加到工具箱中
    C#写的CRC16检验算法
    C# 递归程序 获取某个节点下的全部子节点
    软件著作权申请中源代码文档的编辑方法
    c#使用Flash控件AxShockwaveFlash
    国内银行CNAPS CODE 查询
    中国版权保护中心-无法注册的解决办法
    jquery weui做的三级联动
    Validation of viewstate MAC failed 解决办法
    OllyDbg 介绍
  • 原文地址:https://www.cnblogs.com/winner192/p/11815727.html
Copyright © 2011-2022 走看看