统一异常处理

在项目中,经常会对一些条件之类的参数进行校验,如果有问题,则向前端返回错误信息。之前的项目里,只有在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中的统一异常处理
posted on 2018-06-06 17:40  飞羽127  阅读(939)  评论(0编辑  收藏  举报