自定义系列 之 全局异常处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanxing1964/article/details/82315033

1,重写HandlerExceptionResolver接口的resolveException方法做一个全局的异常处理(基于spring mvc)

    不同于继承Exception按照业务自定义一个异常,这种方法作用范围更大,在Controller层通过throws把异常抛出来,交给spring mvc来处理,重写的方法里判断异常类型(当然这些异常类型也可以是我们自定义的)进而做出处理。

全局处理异常类

public class ExceptionHandler implements HandlerExceptionResolver,Ordered {

    private static Logger logger = Logger.getLogger(ExceptionHandler.class);

    private static Integer order = Integer.MIN_VALUE;
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                                         Object handler, Exception e) {
        logger.error("异常请求URL:" + httpServletRequest.getRequestURL());
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            logger.warn("处理器的方法为:" + method.getName());
        }
        logger.error("异常栈 ==>> ");
        logger.error(ExceptionUtils.parseException(e));

        if (e instanceof NoHandlerFoundException){
            responseJson(httpServletResponse,"请求的页面不存在");
            return new ModelAndView((String) null);
        } else if(e instanceof ServletException){
            responseJson(httpServletResponse,e.getMessage());
            return new ModelAndView((String) null);
        }
        else if (e instanceof PermissionDefineException){
            responseJson(httpServletResponse, "您没有权限进行该操作");
            return new ModelAndView((String) null);
        }
        else if (e instanceof BaseException) {
            responseJson(httpServletResponse, "数据异常~ 请稍后再试");
            return new ModelAndView((String) null);
        }else {
            responseJson(httpServletResponse, "服务器异常~ 请稍后再试");
            return new ModelAndView((String) null);
        }
    }

    private void responseJson(HttpServletResponse response,String content){
        response.setHeader("Content-type", "text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        ApiResponseBean respBean = ApiResponseBuilder.buildResponse(-1,content);
        PrintWriter out =null;
        try {
           out =  response.getWriter();
           out.write(JsonUtils.toJSONString(respBean));
           out.flush();
            out.close();
        } catch (IOException e) {
            logger.error(ExceptionUtils.parseException(e));
        }finally {
            if(out!=null){
                out.close();
            }
        }
    };


    @Override
    public int getOrder() {
        return order;
    }
}

加入xml文件

    <!--定义全局异常处理-->
    <bean class="com.uiao.web.exception.ExceptionHandler"/>

另外:spring boot也支持注解的异常处理,后续补上。

2,在web.xml里配置(基于spring mvc)

其实这个不能算是异常处理,因为不涉及异常的一些捕获抛出,所有流程都是正常执行的,只是对最后结果做一个再处理。

<error-page>
        <error-code>404</error-code>
        <location>/notFound</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/sysError</location>
    </error-page>

异常结果处理类

@Controller
public class ExceptionController {

    @RequestMapping("notFound")
    @ResponseBody
    public Map<String,Object> processNotFountException(){
        return Tools.getApiResponse(1,"页面未找到,请检查路径是否正确");
    }

    @RequestMapping("sysError")
    @ResponseBody
    public Map<String,Object> processException(){
        return Tools.getApiResponse(1,"数据异常,请稍后再试");
    }
}

这样可以给前端返回一些具体的提示。

猜你喜欢

转载自blog.csdn.net/fanxing1964/article/details/82315033