日期:2014-05-18  浏览次数:20630 次

事务方式内无法捕获异常
想在一个事务中捕获异常并重新操作数据库,但是调试发现异常是在方法结束的时候才报出,无法捕获,有没有什么解决方案,代码如下

@Transactional
public void click(Goods goods) throws Exception {
if(goods != null) {
try {
GoodsCount goodsCount = goodsCountDao.findUniqueBy(GoodsCount.PROPERTY_NAME_FOR_GOODS_ID, goods.getId());
if(goodsCount == null) {
goodsCount = new GoodsCount();
goodsCount.setGoods(goods);
goodsCount.setId(UuidUtils.randomUuid());
}
goodsCount.setClickCount(goodsCount.getClickCount() + 1);
goodsCountDao.save(goodsCount);
} catch(Exception e) {
LoggerUtils.logException(e);
//版本异常或者违反唯一约束
if(e instanceof StaleObjectStateException || e instanceof ConstraintViolationException || e instanceof DataIntegrityViolationException) {
//再次加重重新处理一遍
GoodsCount goodsCount = goodsCountDao.findUniqueBy(GoodsCount.PROPERTY_NAME_FOR_GOODS_ID, goods.getId());
goodsCount.setClickCount(goodsCount.getClickCount() + 1);
goodsCountDao.save(goodsCount);
} else {
throw e;
}
}
}
}

------解决方案--------------------
再写个方法调用不行?
------解决方案--------------------
觉得LZ捕获不到的原因是因为调用其它方法里面捕获了异常,但是没有再次抛出来。
看看你的findUniqueBy、save等方法,是否存在try-catch块,都做了什么处理。
------解决方案--------------------
这恐怕和事物的原子性相关吧。
你期望的操作应该不能够实现。
------解决方案--------------------
引用:
Quote: 引用:

觉得LZ捕获不到的原因是因为调用其它方法里面捕获了异常,但是没有再次抛出来。
看看你的findUniqueBy、save等方法,是否存在try-catch块,都做了什么处理。


不会啊,我在调用这个service的controller方法里再次捕获异常,就能捕获到

那可能是事务本身的异常了,在方法结束后,事务结束前。打印下异常堆栈看看呢?
------解决方案--------------------
请参考http://www.360doc.com/content/12/1109/18/6161903_246870991.shtml
------解决方案--------------------
楼主应该打印看下具体的异常,可能不是instanceof 列出的,也可能是if(e instanceof StaleObjectStateException---){} 中的抛出的,楼主可以在方法的调用处try catch 可能的异常- -
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

觉得LZ捕获不到的原因是因为调用其它方法里面捕获了异常,但是没有再次抛出来。
看看你的findUniqueBy、save等方法,是否存在try-catch块,都做了什么处理。


不会啊,我在调用这个service的controller方法里再次捕获异常,就能捕获到