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

posted on 2019-01-16 22:25  ws563573095  阅读(234)  评论(0编辑  收藏  举报

导航