SpringMVC异常处理
SpringMVC通过HandlerExceptionResolver处理程序的异常,包括Handler映射、数据绑定以及目标方法执行时发生的异常。
SpringMVC提供的HandlerException是一个接口,它的实现类:
1.AbstractHandlerExceptionResolver它还有自己的子类
1.AnnotationMethodExceptionResolver
2.DefaultHandlerExceptionResolver
3.ResponseStatusExceptionResolver
4.SimpleMappingExceptionResolver
2.HandlerExceptionResolverComposite
DispatcherServlet默认装配的HandlerResolvedr:
1.AnnotationMethodExceptionResolver
2.DefaultHandlerExceptionResolver
3.ResponseStatusExceptionResolver
如果我们使用了mvc:annotation-driven/
AnnotationMethodExceptionResolver
ExceptionHanlderExceptionResolver
DefaultHandlerExceptionResolver
ResponseStatusExceptionResolver
ExceptionHandlerExceptionResolver:
主要处理Handler中使用@ExceptionHandler注解定义的方法
@ExceptionHandler注解定义的方法优先级的问题:例如发生的是NullPointException,但是声明的异常有RuntimeException和Exception,此时会根据异常的就近继承关系找到深度最浅的那个@ExceptionHandler注解方法,也就是标记RuntimeException的方法。
ExceptionHandlerMethodResolver内部如果找不到@ExceptionHandler注解的话,会找@ControllerAdvice中的@ExceptionHandler注解的方法
注意:我们在使用@ExceptionHandler的时候,用此注解修饰的方法中可以写入Exception类型得对象,此对象对应出现的异常,如果此时我们需要将异常对象保存在属性范围中时,不能使用map对象保存,而是使用ModelAndView保存。
注意:我们现在编写的处理异常的方式,只能处理Handler方法中出现的异常。那么如果在Handler方法中没有找到匹配的异常,SpringMVC会去使用@ControllerAdvice修饰的类中查找异常。
例子:
(1)书写一个简单的数字计算的超链接
<a href = "mathtest?mun=0">mathtest</a>
(2)在handler里面写入计算的处理方法
@RequestMapping("mathtest")
public String mathtest(@RequestParam("mun") Integer mun){
System.out.println("result"+(10/mun));
return "success";
}
(3)异常处理的代码:
@ExceptionHandler(value=ArithmeticException.class)
public String handlerExceptiontest(){
return "error";
}
(4)我们可以通过ModelAndView对象将异常传递给跳转页面,代码如下:
@ExceptionHandler(value=ArithmeticException.class)
public ModelAndView handlerExceptiontest(Exception ex){
ModelAndView mv = new ModelAndView("error");
mv.addObject("ex", ex);
return mv;
}
(5)如果在handler类里面找不到异常处理MVC回去有@ControllerAdvice注解的类去寻找处理方法,代码如下:
package com.oracle.handler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class exceptiontest {
@ExceptionHandler(value=ArithmeticException.class)
public ModelAndView handlerExceptiontest(Exception ex){
ModelAndView mv = new ModelAndView("error");
mv.addObject("ex", ex);
return mv;
}
}
ResponseStatusExceptionResolver:
在异常以及异常父类中找到@ResponseStatus注解,然后使用这个注解的属性进行处理。
我们可以用注解来进行修饰产生的异常:
1.修饰异常类例子:
(1)自定义异常代码
package com.oracle.po;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value=HttpStatus.NOT_EXTENDED,reason= "用户名不正确")
public class MyException extends RuntimeException{
public MyException(String name ){
super(name);
}
}
(2)跳转的超链接
<a href = "extest?mun=10">extest</a>
(3)处理的方法
@RequestMapping(value = "/extest")
public String extest(@RequestParam("mun") Integer num){
if(num==10){
throw new MyException("自定义异常");
}
return "success";
}
注:当用@ResponseStatus注释修饰后,当产生异常的时候,就会抛出与注释相关的异常,value属性设置异常的状态码,reason是产生异常的原因。
2.当修饰类中的方法的
当修饰方法时,方法正常运行之后也会抛出异常:
@RequestMapping(value = "/extest")
@ResponseStatus(value=HttpStatus.NOT_EXTENDED,reason= "用户名不正确")
public String extest(@RequestParam("mun") Integer num){
if(num==10){
throw new MyException("自定义异常");
}
return "test";
}