1. Spring Web MVC

1.3 注解控制器

1.3.6 异常

@Controller@ControllerAdvice 类可以创建 @ExceptionHandler 方法处理控制器方法内的异常,如下例:

@Controller
public class SimpleController {
	// ...
	
	@ExceptionHandler
	public RespinseEntity<String> handle(IOException ex) {
		// ...
	}
}

异常可以匹配抛出的顶层异常(如,直接抛出 IOException)或包在顶层异常内的直接原因(如,IOException 包装的 IllegalStateException)

为了匹配异常类型,建议如上面例子,方法参数就声明要捕获的异常。当匹配到多个异常方法,通常会匹配到根异常对应的方法。具体点说, ExceptionDepthComparator 用来对抛出异常的层次深度进行排序。

另外,注解也可以限制匹配的异常类型,如下例:

@ExceptionHandler({FileSystemException.class, RemoteException.class})
public ResponseEntity<String> handle(IOException ex) {
	// ...
}

甚至直接抛出最基础的异常,在注解中限制特定异常类型也可以,如下例:

@ExceptionHandler({FileSystemException.class, RemoteException.class})
public ResponseEntity<String> handle(Exception ex) {
	// ...
}

根异常和直接异常的匹配的差异可能会出乎意料。
上面的 IOException 变量出现的地方, 函数调用时接收到的是 FileSystemExceptionRemoteException 类型的参数,因为他们都是 IOException 的子类。但是,如果匹配到的异常是 IOException 的子类的包装类,