zoukankan      html  css  js  c++  java
  • 统一异常处理

    统一异常处理

    在项目中,经常会对一些条件之类的参数进行校验,如果有问题,则向前端返回错误信息。之前的项目里,只有在controller层可以返回错误信息,而在service层,只能返回固定的结果,不能说明错误信息。此时可以通过自定义异常,然后统一处理来解决。

    对于统一异常,通常有四种解决方法,推荐使用 第一种 或者 第四种,分别如下

    (推荐)方法一: 通过配置文件设置异常处理

    自定义异常

    /**
     * 统一异常信息
     *
     * @author feiyu127
     * @date 2018-06-06 11:19
     */
    public class CustomException extends RuntimeException {
        public CustomException() {
        }
    
        public CustomException(String message) {
            super(message);
        }
    
        public CustomException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    
    

    对异常捕获并处理

    /**
     * @author feiyu127
     * @date 2018-06-06 11:15
     */
    @Configuration
    public class WebMvcConfigure extends WebMvcConfigurerAdapter {
    
        private final Logger logger = LoggerFactory.getLogger(WebMvcConfigurer.class);
        // 对自定义的异常进行处理,非自定义的不处理
        @Override
        public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
            exceptionResolvers.add((request, response,handler, ex) -> {
                if (ex instanceof CustomException) {
                    Result result = ResultUtil.buildFail(ex.getMessage());
                    responseResult(response, result);
                }
                return new ModelAndView();
            });
        }
        // 输出json格式错误信息
        private void responseResult(HttpServletResponse response, Result result) {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-type", "application/json;charset=UTF-8");
            response.setStatus(200);
            try {
                response.getWriter().write(JSON.toJSONString(result));
            } catch (IOException ex) {
                logger.error(ex.getMessage());
            }
        }
    }
    

    在以上配置后,在service层校验失败后,可以主动去抛自定义异常来直接向前端返回错误提示信息

    方法二:使用springmvc中自带的简单异常处理器 SimpleMappingExceptionResolver

    方法三 : 使用 @ExceptionHandler 注解实现异常处理

    在BaseController 里对异常进行设置,需要捕获的controller都需继承该BaseController

    public class BaseController { 
        @ExceptionHandler
        @ResponseBody
        public Map<String, Object> exp(HttpServletRequest request, Exception ex) { 
          Map<String, Object> data = new HashMap<String, Object>();
            if(ex instanceof CustomException) {
                CustomException e = (CustomException)ex;
            }
            data.put("msg", ex.getMessage());
            data.put("success", false);
            data.put("data", null)
        }
    }
    

    (推荐)方法四: @ControllerAdvice 配合 @ExceptionHandler 使用,达到方法一的效果

    @RestControllerAdvice
    public class ExceptionHandlerController {
    
        @ExceptionHandler
        public Result handleCustomException(Exception ex) {
            if (ex instanceof CustomException) {
                Result result = ResultUtil.buildFail(ex.getMessage());
                return result;
            }
            return null;
        }
    }
    

    参考链接:

    1. Spring MVC异常统一处理的三种方式
    2. SpringMVC中的统一异常处理
  • 相关阅读:
    转载:史上最全|阿里那些牛逼带闪电的开源工具,你知道几个?
    互怼、IPO、雷潮、寒冬,2018 互联网圈的那些事儿
    微信迎来又一次重大改版 7.0 版本
    公众号文章目录
    聊几个与赚钱相关的小事情
    使用docker Registry快速搭建私有镜像仓库
    开源组件ELK日志系统配置与管理
    Mysql MHA高可用集群架构
    强大的开源企业级数据监控利器Lepus安装与配置管理
    关于下载gitbash客户端
  • 原文地址:https://www.cnblogs.com/feiyu127/p/9146398.html
Copyright © 2011-2022 走看看