我在这里看了其他一些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
块中,因为它在某些条件之外。
如果这确实闻起来很糟糕(我怀疑确实如此),那么如何实现这一目标?
这绝对是一种代码气味。 在方法末尾重新引发异常将覆盖异常的调用堆栈,因此看起来所有异常都发生在方法末尾,而不是它们实际发生的位置。
如果无法将额外的代码放在现有的 finally 中,则创建嵌套的 try..最后阻止:
try {
try { //something }
finally {
DoSomething();
}
... //more code
}
finally {
// cleanup code
}
来自OP的注释:请参阅此代码,了解此答案的作者引导我正确推导出的内容。
既然即使在发生异常时也想运行"更多代码",为什么不在最后放置"更多代码"呢? 这本质上就是 finally 的目的 - 即使发生异常,也可以保证执行
所以:
try {
// something
} catch (Exception e) {
***// more code here***
DoSomething();
throw;
}
储存前任和抛弃前任;会吞噬内心的期待。 你想扔;以确保堆栈中的任何内容都不会被吞下。