Java Web项目全局异常捕获实现

Java Web项目,有时候系统会抛异常,或者说我们对各种数据进行校验抛异常,而这些异常我们是不能直接抛到页面的,应该以Restful形式正常返回,并且把异常信息也带出来,交给前端提示。

如果每个接口都要做异常捕获非常的繁琐和重复,我们应该统一去处理程序中的异常。

实现步骤

1、定义异常类

我们首先定义业务需要的异常类,比如ParamException表示参数校验有误的异常,AuthException表示认证异常等,最好是RuntimeException,这样就不需要显示去捕获了。

2、实现GlobalExceptionResolver类

public class GlobalExceptionResolver implements HandlerExceptionResolver{
    private static Logger logger = LoggerFactory.getLogger(GlobalExceptionResolver.class);
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        response.setStatus(HttpStatus.OK.value());
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Cache-Control","no-cache,must-revalidate");
        try {
            if(ex instanceof ParamException){
                response.getWriter().write(RestResult.error(RestResult.CODE_PARAM_ERROR,ex.getMessage()));
            }else {
                response.getWriter().write(RestResult.error(RestResult.CODE_UNKNOW_ERROR,ex.getMessage()));
            }
        }catch (IOException e){
            logger.error("与客户端通讯异常:"+e.getMessage(),e);
            e.printStackTrace();
        }
        ModelAndView modelAndView = new ModelAndView();
        return modelAndView;
    }
}

上面代码中,我事先针对不同的异常类型定义不同的返回码,这样直接以JSON格式返回到前端。

3、配置bean

<bean id="exceptionResolver" class="cn.mitest.mtr.web.handler.GlobalExceptionResolver">

调用系统接口时,如果发生异常,则也能够正常获取到JSON格式数据,通过code字段可以知道是什么类型的异常,通过msg字段可以获得提示信息。如此处理,有异常,我们直接抛就行,无需再进行特殊处理。

© 2019 FunGa技术札记 All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero