日常提交

This commit is contained in:
wu xiangkai
2022-12-21 21:23:36 +08:00
parent 5cb990c270
commit ded0e315b8

View File

@@ -577,7 +577,7 @@ public class SimpleController {
} }
} }
``` ```
该异常参数会匹配被抛出的顶层异常例如被直接抛出的IOException也会匹配被包装的内层cause例如被包装在IllegalStateException中的IOException。**该参数会匹配任一层级的cause。** 该异常参数会匹配被抛出的顶层异常例如被直接抛出的IOException也会匹配被包装的内层cause例如被包装在IllegalStateException中的IOException。**该参数会匹配任一层级的cause exception并不是只有该异常的直接cause exception才会被处理。**
> 只要@ExceptionHandler方法的异常参数类型匹配异常抛出stacktrace中任一层次的异常类型异常都会被捕获并且处理。 > 只要@ExceptionHandler方法的异常参数类型匹配异常抛出stacktrace中任一层次的异常类型异常都会被捕获并且处理。
```java ```java
@PostMapping("/shiro") @PostMapping("/shiro")
@@ -590,5 +590,43 @@ public class SimpleController {
return e.getMessage() + ", Jar"; return e.getMessage() + ", Jar";
} }
``` ```
> 如果有多个@ExceptionHandler方法匹配抛出的异常链那么 > 如果有多个@ExceptionHandler方法匹配抛出的异常链那么root exception匹配会优先于cause exception匹配。
> ExceptionDepthComparator会根据各个异常类型相对于抛出异常类型root exception的深度来进行排序。
> ```java
> // 在调用/shiro接口时IOException离root exceptionRuntimeException更近
> // 故而会优先调用handleIOException方法
> @PostMapping("/shiro")
> public String shiro() throws IOException {
> throw new RuntimeException(new IOException(new SQLException("fuck")));
> }
>
> @ExceptionHandler
> public String handleIOException(IOException e) {
> return e.getMessage() + ", IO";
> }
>
> @ExceptionHandler
> public String handleSQLException(SQLException e) {
> return e.getMessage() + ",Exception";
> }
> ```
对于@ExceptionHandler可以指定该方法处理的异常类型来缩小范围如下方法都只会匹配root exception为指定异常或异常链中包含指定异常的场景
```java
@ExceptionHandler({FileSystemException.class, RemoteException.class})
public ResponseEntity<String> handle(IOException ex) {
// ...
}
// 甚至可以将参数的异常类型指定为一个非常宽泛的类型例如Exception
@ExceptionHandler({FileSystemException.class, RemoteException.class})
public ResponseEntity<String> handle(Exception ex) {
// ...
}
```
上述两种写法的区别是:
1. 如果参数类型为IOException那么当cause exception为FileSystemException或RemoteException且root exception为IOException时实际的cause exception要通过ex.getCause来获取
2. 如果参数类型为Exception那么当cause exception为FileSystemException或RemoteException且root exception不为指定类型异常时指定类型异常统一都通过ex.getCause来获取