1

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/finally 之外)运行,并且如果发生异常则抛出异常,但直到所述代码运行之后。我不能将所有代码都放在finally块中,因为它超出了某些条件。

如果这样做,事实上,闻起来很糟糕(我怀疑它确实如此),人们将如何实现这一目标?

4

2 回答 2

6

这绝对是一种代码味道。在方法末尾重新抛出异常将覆盖异常的调用堆栈,因此看起来所有异常都发生在方法末尾而不是真正发生的地方。

如果你不能将额外的代码放在现有的 finally 中,你可以创建嵌套的 try..finally 块:

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

来自 OP 的注释:请参阅此代码以了解此答案的作者让我正确得出的内容。

于 2012-05-17T05:28:09.987 回答
0

既然你想在发生异常的情况下运行“更多代码”,为什么不把“更多代码”放在最后呢?这本质上就是 finally 的用途——即使发生异常也保证执行

所以:

try {
    // something 
} catch (Exception e) {

    ***// more code here***

    DoSomething();
    throw;
}

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

于 2012-05-17T05:24:42.263 回答