一、异常处理
springMVC实现异常处理,必须实现HandlerExceptionResolver接口。
该接口的实现类都是异常的各种处理方式:
(一)、@ExceptionHandler异常处理
1、异常处理方法
ExceptionHandlerExceptionResolver类:主要提供了的@ExceptionHandler注解,并通过该注解处理异常。
如果使用了@ExceptionHandler注解的方法类,该类中其他方法中抛出@ExceptionHandler注解的方法所捕获的异常,就转到@ExceptionHandler注解的方法去处理(相当于catch)。
@ExceptionHandler注解的方法捕获是最短优先(最接近抛出的异常)。例:有两个捕获异常的方法:第一个是针对ArithmeticException.class捕获,第二个是针对Exception.class的捕获。当抛出ArithmeticException异常的时候,就直接进入第一个方法(对ArithmeticException.class捕获的方法)。
例:
请求页面(index.jsp):
Controller处理请求(这里新建一个类,类里面发生异常后,转到@ExceptionHandler注解的方法):
注意:这里@ExceptionHandler注解的方法的方法参数必须是异常类型(Trowable或其子类),不能包含其他类型的参数。
异常展示页面:
例:针对@ExceptionHandler注解的方法捕获是最短优先(最接近抛出的异常)的案例。
这里上面例子的基础上,建立第二个例子。
Controller处理请求类:(最短优先)
2、异常处理类
通过@ControllerAdvice注解来注解异常处理类。
该@ControllerAdvice注解中的异常处理方法可以处理同一个包下任何类中的抛出异常。
如果类内部和包中都捕获了相同的异常,最短路径优先(执行类内部的捕获异常的方法)。
例:
请求页面(index.jsp):
Controller处理请求(方法中故意抛出异常):
异常处理类:
(二)、@ResponseStatue异常处理
ResponseStatusExceptionResolver类:自定义异常显示页面。主要提供了的@ResponseStatue注解。
@ResponseStatue注解:既可以用在类的前面,也可以用在方法(发生异常跳转到@ResponseStatue注解方法)的前面。
例:跳转到异常处理类
请求页面(index.jsp):
Controller处理请求:
自定义的异常类:
例:跳转到异常处理方法
请求页面(index.jsp):
Controller处理请求(这里面既有处理请求,又有处理异常):
(三)、其他异常
1、DefaultHandlerExceptionResolver类
springMVC中特殊处理的一些异常。具体异常见底层代码(avaDoc中)。j例:405异常。
@see org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
@see #handleNoSuchRequestHandlingMethod
@see #handleHttpRequestMethodNotSupported:如果springMVC的处理方法限制为POST方式,则实际请求的方式为GET,则会出发该异常页面,这个异常是springMVC自己默认的。
@see #handleHttpMediaTypeNotSupported
@see #handleMissingServletRequestParameter
@see #handleServletRequestBindingException
@see #handleTypeMismatch
@see #handleHttpMessageNotReadable
@see #handleHttpMessageNotWritable
@see #handleMethodArgumentNotValidException
@see #handleMissingServletRequestParameter
@see #handleMissingServletRequestPartException
@see #handleBindException
2、SimpleMappingExceptionResolver类
通过配置来实现异常的处理。配置信息:
例:
请求页面(index.jsp):
Controller处理请求并抛出异常:
springmvc.xml配置: