开启生长之旅!这是我参与「日新方案 12 月更文应战」的第21天,点击查看活动详情
3.10 反常处理****
SpringMVC: HandlerExceptionResolver接口,
该接口的每个完成类 都是反常的一种处理方式:
3.10.1 ExceptionHandlerExceptionResolver
主要供给了@ExceptionHandler注解,并经过该注解处理反常****
//该办法 能够捕获本类中 抛出的ArithmeticException反常
@ExceptionHandler({ArithmeticException.class,ArrayIndexOutOfBoundsException.class })
public String handlerArithmeticException(Exception e) {
System.out.println(e +”============”);
return “error” ;
}
@ExceptionHandler({Exception.class})
publicModelAndView handlerArithmeticException2(Exception e) {
ModelAndView mv= newModelAndView(“error”);
System.out.println(e+”============”+”该@ControllerAdvice中的反常处理办法,能够处理任何类中的反常”);
mv.addObject(“er”, e) ;
returnmv;
}
@ExceptionHandler标识的办法的参数 必须在反常类型(Throwable或其子类) ,不能包括其他类型的参数
反常处理路径:最短优先
假如有办法抛出一个ArithmeticException反常,而该类中 有2个对应的反常处理法你发:
@ExceptionHandler({Exception.class })
public ModelAndView handlerArithmeticException2(Exception e) {}
@ExceptionHandler({ArithmeticException.class })
public ModelAndView handlerArithmeticException1(Exception e) {}
则优先级: 最短优先。
@ExceptionHandler默认只能捕获 当时类中的反常办法。****
假如产生反常的办法 和处理反常的办法 不在同一个类中:@ControllerAdvice
总结:假如一个办法用于处理反常,并且只处理当时类中的反常:@ExceptionHandler
假如一个办法用于处理反常,并且处理一切类中的反常: 类前加@ControllerAdvice、 处理反常的办法前加@ExceptionHandler
3.10.2 ResponseStatusExceptionResolver****
ResponseStatusExceptionResolver:自定义反常显示页面 @ResponseStatus
@ResponseStatus(value=HttpStatus.FORBIDDEN,reason=”数组越界222!!!”)
publicclassMyArrayIndexOutofBoundsExceptionextendsException {//自定义反常
}
@ResponseStatus也能够标志在办法前:
@RequestMapping(“testMyException”)
publicString testMyException(@RequestParam(“i”) Integer i) throwsMyArrayIndexOutofBoundsException {
if(i== 3) {
thrownewMyArrayIndexOutofBoundsException();//抛出反常
}
return“success”;
}
@RequestMapping(“testMyException2”)
publicString testMyException2(@RequestParam(“i”) Integer i) {
if(i== 3) {
return“redirect:testResponseStatus”;//跳转到某一个 反常处理办法里
}
return“success”;
}
3.10.3 反常处理的完成类****
DefaultHandlerExceptionResolver:SPringMVC在一些常见反常的基础上(300 500 405),新增了一些反常,例如:
- @see org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
* @see #handleNoSuchRequestHandlingMethod
* @see #handleHttpRequestMethodNotSupported :假如springmvc的处理办法限制为post方式,假如实践请求为get,则会触发此反常显示的页面
* @see #handleHttpMediaTypeNotSupported
* @see #handleMissingServletRequestParameter
* @see #handleServletRequestBindingException
* @see #handleTypeMismatch
* @see #handleHttpMessageNotReadable
* @see #handleHttpMessageNotWritable
* @see #handleMethodArgumentNotValidException
* @see #handleMissingServletRequestParameter
* @see #handleMissingServletRequestPartException
* @see #handleBindException
3.10.4 反常处理的完成类
SimpleMappingExceptionResolver:经过装备来完成反常的处理****
<beanclass= “org.springframework.web.servlet.handler.SimpleMappingExceptionResolver” >
<propertyname= “ exceptionMappings” >
<propkey= “java.lang.ArithmeticException” >
error
<propkey= “java.lang.NullPointerException” >
error
****