springmvc之异常处理中ExceptionHanderExceptionResolver

时间:2022-07-23
本文章向大家介绍springmvc之异常处理中ExceptionHanderExceptionResolver,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、springmvc通过HandlerExceptionResolver处理程序的异常,包括Handler映射、数据绑定以及目标方法执行时发生的异常。

2、springmvc提供的HandlerExceptionResolver的常用实现类:

  • ExceptionHanderExceptionResolver
  • DefaultHanderExceptionResolver
  • ResponseStatusExceptionResolver
  • SimpleMappingExceptionResolver

3、DispatchServlet默认装配HanderExceptionResolver

在java中:

    @ExceptionHandler({RuntimeException.class})
    public ModelAndView handleArithmeticException2(Exception ex) {
        System.out.println("出异常了--->:"+ex);
        ModelAndView mv = new ModelAndView("error");
        mv.addObject("exception",ex);
        return mv;    
    }
    
    @ExceptionHandler({ArithmeticException.class})
    public ModelAndView handleArithmeticException(Exception ex) {
        System.out.println("出异常了:"+ex);
        ModelAndView mv = new ModelAndView("error");
        mv.addObject("exception",ex);
        return mv;    
    }
    
    @RequestMapping("/testExceptionHandlerExceptionReslover")
    public String testExceptionHandlerExceptionReslover(@RequestParam("i") Integer i) {
        System.out.println("result-->"+(10 / i));
        return "success";
    }

index.jsp

<a href="testExceptionHandlerExceptionReslover?i=10">testExceptionHandlerExceptionReslover</a>

success.jsp

    <p>success</p>

error.jsp

    <h4>error page</h4>
    ${exception}

启动服务器之后:

点击:

将I=10改为i=0并刷新:

在控制台可看到:

说明:

(1)在@ExceptionHandler方法的入参中可以加入Exception类型的参数,该参数即对应发生的异常对象。

(2)在@ExceptionHandler方法的入参中不能传入Map,若希望将异常信息传到前端页面上,需要使用ModelAndView。

(3)@ExceptionHandler方法标记的异常有优先级问题。

(4)@ControllerAdvice:如果在当前Handler中找不到@ExceptionHandler方法标记的出现的异常,则会在@ExceptionHandler标记的类中查找@ExceptionHandler标记的方法来处理异常。

比如我们新建一个java文件,在里面加入:

package com.gong.springmvc.test;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class HandleException {
    @ExceptionHandler({ArithmeticException.class})
    public ModelAndView handleArithmeticException(Exception ex) {
        System.out.println("出异常了:"+ex);
        ModelAndView mv = new ModelAndView("error");
        mv.addObject("exception",ex);
        return mv;    
    }
}

仍可以达到相同的效果。