gpt4 book ai didi

Java异常被捕获后似乎重新抛出

转载 作者:行者123 更新时间:2023-12-01 12:31:28 25 4
gpt4 key购买 nike

我遇到了一个我不明白的场景。我有以下 Web 服务(使用下面的一堆伪代码)。

在我的事务管理器类中:

Response HandleRequest(List<Object> myStuff) throws RemoteException   
{
Map<Object, String> problemMap = dataManager.saveMyStuff(myStuff)

//Nothing here gets executed because HibernateSystemExeption was mysteriously (re)thrown
log.warn("Step 5");
if(problemMap.size() > 0)
{
//Put problem objects and error messages in response
return response;
}
}

然后在我的 DataManager 类中我有:

Map<Object, String> saveMyStuff(List<Object> mystuff) 
{
Session sess = getSession();
Transaction tx = sess.beginTransaction();
boolean successful = true;

Map<Object, String> problems = new HashMap<Object, String>();
for(Object o : mystuff)
{
try
{
//Do some hibernate stuff here that throws a HibernateSystemException
}
catch(Exception e)
{
log.warn("Caught an exeption!", e);
successful = false;
log.warn("Step 1");
problems.put(o, "Couldn't Store object");
log.warn("Step 2");
}
}

log.warn("Step 3");
try
{
if(successful)
tx.commit;
else
tx.rollback();
}
catch(Exception e)
{
log.warn("Another Exception caught!", e);
}

log.warn("Step 4");
return problems;
}

发生的情况是数据管理器中成功捕获了异常,并且我在日志文件中看到了它。代码继续执行 return 语句。但是,当它从数据管理器返回时,我在事务管理器中得到相同的异常,就好像它从未被数据管理器捕获一样,并且该异常作为远程异常而不是响应传递回用户原始。执行 saveMyStuff 调用后,事务管理器中没有任何内容。就好像异常保留在堆栈中,直到方法返回,然后再次抛出,即使它已在数据管理器中处理。有没有人见过这样的事情,或者知道会发生什么?

编辑:经过更多的实验后,问题似乎与它是 HibernateSystemException 这一事实有关。如果我抛出一个通用异常作为测试,代码将按我的预期工作。那么 HibernateSystemException 是什么导致了这种奇怪的行为呢?

编辑2:我已按照建议进行操作,并将事务提交/回滚包装在 try/catch 中。异常仍然返回给用户。我还添加了调试打印语句。在日志中,我看到打印了步骤 1-4,但没有看到步骤 5。我也没有看到从事务提交/回滚 block 捕获异常。

最佳答案

您所描述的内容与Java异常处理逻辑不符。因此,一些不同的事情正在发生,例如tx.rollback() 可能会抛出异常。尝试将回滚也包含在 try-catch 中并在那里处理异常。

关于Java异常被捕获后似乎重新抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25897677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com