后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节7(核心对象,异常处理器,ExceptionHandlerExceptionResolver & ResoponseStatusExceptionResolver)

1、概念

  它的概念是建立异常类型与方法之间的映射关系。即出错之后,运行指定的方法。

  当抛出异常之后,会查找有@ExceptionHandler注解的方法,默认情况下只会在当前Controller类中查找。若要设置全局的, 可以配置Controller的切面。具体做法把异常处理的方法提取到公共类中,在类上添加@ControllerAdvice注解,在方法上添加@ExceptionHandler注解。。

  @ExceptionHandler只有一个属性value,值为异常类型对应的Class类集合。

  当value属性为空时,相当于默认值,会处理所有的异常。

  若value值重复时,即一个exception 类型有多个方法与之对应时,抛出IllegalStateException。

  当异常抛出,被HandlerExceptionResolver处理之后,抛出的异常被捕获,请求会被视为正常结束,返回的状态码为200。若想返回特定的响应码,可以配合@ResponseStatus注解。

2、使用

  第一步,注入ExceptionHandlerExceptionResolver,查看dispatcher.properties,它是默认存在的,无需额外的配置。

  第二步,编写方法handlerException,标注@ExceptionHandler,value属性指定异常类型。

  注:@ControllerAdvice相当于AOP中的advice

3、示例

  若配置适用于单个Controller,示例如下

// 请求的方法
@GetMapping("/test/exception")
public String divideNumber() {
	System.out.println(1 / 0);
	return "";
}

// 处理异常的方法
@ExceptionHandler(value = ArithmeticException.class)
public ModelAndView resolve() {
	return new ModelAndView("error/arithmeticException");
}

  若配置适用于全局的异常处理,示例如下:

// 相当于AOP中的advice
@ControllerAdvice
public class ExceptionController {
	/**
	 * 
	 * @Title: resolve
	 * @Description:解决异常的方法
	 * @return
	 */
	@ExceptionHandler(value = ArithmeticException.class)
	public ModelAndView resolve() {
		return new ModelAndView("error/arithmeticException");
	}
}

4、ResponseStatusExceptionResolver

  它的概念是建立异常类型与响应码之间的映射关系,若没有上述的ExceptionResolver,Web容器会根据响应码生成特定的页面,例如最常见的404,501。若使用上述的ExceptionResolver,它只会改变响应码的值。

  ResponeStatusExceptionResolver会根据@ResponseStatus注解的code属性值返回响应码

  当@ResponseStatus标注在异常类上时,它只适用于自定义异常。Java内置,第三方的异常类型无法修改,例如NullPointerException

  当@ResponseStatus标注在ExceptionHandler的handler方法上时,它适用于该方法匹配的所有异常。

  当@ResponseStatus标注在@RequestMapping的方法上时,设置方法的响应码,无论方法是否正常结束。

  使用时需要注入ResponeStatusExceptionResolver,它是默认注入的。

原文地址:https://www.cnblogs.com/rain144576/p/12903067.html