在springboot
中,推荐使用注解的方式统一异常处理,具体如下:
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleAppException(Exception ex, HttpServletRequest request) {
//......
}
//也可指定具体类型的异常处理
@ExceptionHandler({MethodArgumentNotValidException.class})
public ResponseEntity<?> notValidExceptionHandler(MethodArgumentNotValidException ex) {
//todo
}
}
这种异常处理方式,会给Controller
层织入异常处理的逻辑(AOP),当controller
的method
报错时,会由@ExceptionHandler
注解修饰的方法进行处理.
ExceptionHandlerMethodResolver
用于发现给定类中的@ExceptionHandler 方法,包括它的所有超类,并帮助将给定的异常解析为给定方法支持的异常类型。
该类中getMappedMethod
方法决定了异常具体被哪个 @ExceptionHandler
注解修饰的方法处理(匹配最精确的异常方法处理).
@Nullable
private Method getMappedMethod(Class<? extends Throwable> exceptionType) {
List<Class<? extends Throwable>> matches = new ArrayList<>();
//找到可以处理的所有异常信息。mappedMethods 中存放了异常和处理异常的方法的对应关系
for (Class<? extends Throwable> mappedException : this.mappedMethods.keySet()) {
if (mappedException.isAssignableFrom(exceptionType)) {
matches.add(mappedException);
}
}
// 不为空说明有方法处理异常
if (!matches.isEmpty()) {
// 按照匹配程度从小到大排序
matches.sort(new ExceptionDepthComparator(exceptionType));
// 返回第一个,即最精确的异常类型
return this.mappedMethods.get(matches.get(0));
}
else {
return null;
}
}