java - Java - 捕获/重新抛出行为
问题描述
我有这段Java代码。
void convertFile() {
try{
.....
}catch (Exception e) {
logError("Error in convertJsonFile", e);
throw e;
}finally{
if (writer!=null) {
writer.close();
writer = null;
}
if (fos!=null) {
fos.close();
fos = null;
}
ms2 = System.currentTimeMillis();
logInfo(String.format("Time elapsed: %d seconds.", ((ms2-ms1)/1000)));
logInfo("File conversion complete.");
}
return f + "_changed.xml";
}
catch 块记录并重新抛出异常。
但似乎 finally 块也抛出了一个 RuntimeException。
如果 catch 块像这里所做的那样重新抛出异常,finally 块会被执行吗?
如果我没记错,即使在这种情况下,finally 块也会被执行。好吧,如果是这样...如果我们进入 catch 块(它重新抛出),然后我们进入 finally 块,并且 finally 块也在这一行抛出 RuntimeException 会发生
writer.close();
什么?整个方法会抛出哪个异常——从 catch 块中重新抛出一个异常,还是从 finally 块中抛出 RuntimeException?!
我认为这RuntimeException
将是该方法的最终结果,我们永远不会到达重新抛出的 catch 块中的行。因为我猜想重新抛出的行是在 finally 块之后执行的。但我不确定。我真的很困惑。
有人可以在这里消除我的疑问吗?
似乎我忘记了其中一些细节。
而且我无法正常访问日志,它们位于 Elastic/Kibana 中,访问它们真的很痛苦。
解决方案
- 是的,finally 块将被执行
finally
在这种情况下,将抛出块异常。因此,catch
块中的异常将丢失。
推荐阅读
- sqlite - 整数除列 - SQLite
- google-apps-script - 如何在谷歌脚本中打印变量
- sails.js - 要将数据插入表时,新版本的sails和mongodb出错
- python - python智能十六进制数生成器
- angular - 从两个依赖组合 Observable
- powershell - 从 terraform 将 PSDscAllowPlaintextPassword 设置为 true
- javascript - 关于 React 事件行为的基本查询
- excel - 从 urarranged 文件中提取数据
- wpf - 具有不同 PanningModes 的 WPF 嵌套 ScrollViewers?
- python-3.x - python3异步等待回调