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中的统一异常处理
  • 相关阅读:
    leetcode 141. Linked List Cycle
    leetcode 367. Valid Perfect Square
    leetcode150 Evaluate Reverse Polish Notation
    小a与星际探索
    D. Diverse Garland
    C. Nice Garland
    数的划分(动态规划)
    平衡二叉树(笔记)
    1346:【例4-7】亲戚(relation)
    1192:放苹果(dp + 搜索)
  • 原文地址:https://www.cnblogs.com/feiyu127/p/9146398.html
Copyright © 2011-2022 走看看