尝试/捕获/最后,使用来自 Catch in Final 的异常

本文关键字:in Catch Final 异常 最后 捕获 尝试 | 更新日期: 2023-09-27 18:34:21

我在这里看了其他一些try catch finally问题,但我不确定这个问题是否已得到解答。做这样的事情闻起来很臭吗:

Exception? ex = null;
try { //something }
catch (Exception e) { ex = e ;}
finally {
    DoSomething();        
}
... //more code
//end of method
if (ex !=null) { throw ex; }

基本上,我试图确保运行某些代码(在try/catch/final之外),并且在发生异常时会引发异常,但直到所述代码运行之后。我不能将所有代码都放在finally块中,因为它在某些条件之外。

如果这确实闻起来很糟糕(我怀疑确实如此),那么如何实现这一目标?

尝试/捕获/最后,使用来自 Catch in Final 的异常

这绝对是一种代码气味。 在方法末尾重新引发异常将覆盖异常的调用堆栈,因此看起来所有异常都发生在方法末尾,而不是它们实际发生的位置。

如果无法将额外的代码放在现有的 finally 中,则创建嵌套的 try..最后阻止:

try {
  try { //something }
  finally {
      DoSomething();        
  }
   ... //more code
}
finally {
  // cleanup code
}

来自OP的注释:请参阅此代码,了解此答案的作者引导我正确推导出的内容。

既然即使在发生异常时也想运行"更多代码",为什么不在最后放置"更多代码"呢? 这本质上就是 finally 的目的 - 即使发生异常,也可以保证执行

所以:

try {
    // something 
} catch (Exception e) {
    ***// more code here***
    DoSomething();
    throw;
}

储存前任和抛弃前任;会吞噬内心的期待。 你想扔;以确保堆栈中的任何内容都不会被吞下。