@Transactional注解的方法默认会捕获所有非检查异常,即RuntimeException和Error,可以通过括号声明显示指定处理异常类,如Exception.class
关于异常处理机制:
当代码抛出异常时,异常处理的优先级如下:
- try-catch 块:如果在代码中使用了
try-catch
块来捕获异常,异常将会首先被try-catch
块捕获并处理。只有在try-catch
块中未处理(重新抛出)异常时,异常才会继续传播。 - @Transactional:如果异常从
try-catch
块中传播出来,Spring 的事务管理器(由@Transactional
注解管理)会捕获异常并决定是否回滚事务。事务处理之后,异常继续传播。 - @ExceptionHandler:最后,异常会被全局异常处理器(由
@ControllerAdvice
和@ExceptionHandler
注解管理)捕获并处理。
因此,对于手动捕获的异常,需要手动将其抛出才会被@Transactional处理器捕获,全局处理器的优先级最后,除了特殊的异常可能需要调整传播顺序,大部分不需要考虑其影响。