下面是我遇到问题的代码的基本结构。
@Transactional
void A(){
B();
// Can I identify transaction rollback here?
APICall(); // THIS SHOULD NOT BE CALLED IF THE TRANSACTION FAILS
}
void B(){
try{
C() // throws Null Pointer Exception
}catch(Exception e){
// logs the details
}
}
@Transactional
void C(){
D() // throws Null Pointer Exception
}
整个问题是APICall方法A中的()()。如果事务失败,则不应调用该API。()不捕获D引发的异常(),交易(方法C()),因此外部事务(方法A())也将被标记为回滚。但由于方法B()捕捉到C()抛出的NullPointerException,指令在方法A()中继续执行,调用APICall()方法,但方法A()的事务会回滚,因为内部事务回滚了。
那么,是否有办法检查方法A()的事务是否在方法A()内部被标记为回滚?这样我就可以阻止APICall?或者唯一的办法是在方法B()中重新抛出捕获的异常?
1条答案
按热度按时间bjp0bcyl1#
你现在的做法,我觉得有几个问题。
B()
中的异常被消耗,这是不好的。why consuming exception is badA()
中没有得到正确处理(当B()
中存在异常时),这破坏了异常的全部用途B()
方法,所以在单个A()
中处理来自所有这些方法的响应看起来会非常难看。为什么你要避免使用异常的原因和构建异常的原因一样呢?这种情况需要异常,因为异常不仅可以中断流程,还可以提供完整的堆栈跟踪,这样你就可以更好地处理这种情况。