• 002649:全局异常处理实现


    一、背景

      1、共有的操作应该抽离到框架级别,如exception处理,日志打印   
      2、这样可以屏蔽因不同人的使用习惯而导致的try_catch混乱,同时也可以简化代码的结构,使可读性提高。
      3、现在的后台框架中无聊异常与否对前端的返回结构都是相同的(一般都是actionResult(是否成功,异常码,异常信息,返回对象),这也给异常处理抽离框架级别提供了前提。

    二、问题分析

      1、首先,这要求所有异常的返回的结果结构都是一致的。  
        a、一般,待处理的异常大致分两种:业务异常(需要打warning级别日志,记录入参信息)和系统异常(要打err级别日志,积累出入参及异常信息)。 
      2、可以重写框架全局异常处理的方法来实现   
      3、可以在结果返回前重构异常

    三、具体实现

      1、返回结果设计类设计

        a、一般有两种:带页数的DataResult<T> 和不带页数的ActionResult<T>     
        b、前置用于支持返回记录总页数
        c、DataResult中包括静态方法和边界的结果判断逻辑(hasError)
        

        d、ActionResult<T> 和它类似,但data:List<T>被取代为data:T

      2、spring全局异常处理

        1、这个实现主要思想是为异常提供一个解析视图,视图中做一些逻辑处理,最后将处理结果转成文字返回     
        2、AbstractView便是视图的基类,实现该类对出参进行转换。
        3、ModelAndView 最后将视图和上下文变量放入该对象中交于框架渲染。该处会每次new一个对象,需要优化。
        4、org.springframework.web.servlet.DispatcherServlet.doDispatch().processDispatchResult()中调用,若没有对应的处理视图,会将异常抛出。

      3、拦截器处理

        1、主要是使用拦截器在结果返回前端前进行再处理,该实现的执行在方法2后。     
        2、继承HandlerInterceptorAdapter,实现afterCompletion方法,在该方法中实现对异常的逻辑处理并最后将处理后的字符串写入到response中。
        3、拦截器需要在mvc框架中注入才能生效,即:com.zhicheng.config.WebMvcConfigurer.addInterceptors(InterceptorRegistry)
        4、该方法和实现2一样,也是servlet路由类中调用的,即:org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletion()

    PS:

      代码详见:git@github.com:MindMapKing/springboot_12022327.git

  • 相关阅读:
    REP开发技巧
    css grid栅格布局
    flex学习, 尝试布局一个计算器
    sublime text html插件emmet
    flex布局
    SQL Server为字段添加默认值
    windows和linux文件输
    python eric6 IDE
    git撤销修改
    pyQt5
  • 原文地址:https://www.cnblogs.com/ws563573095/p/10276667.html
Copyright © 2020-2023  润新知