尝试/捕获/最后,在最后使用Catch中的异常?

时间:2012-05-17 05:20:47

标签: c# try-catch-finally

我在这里看了几个其他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块中,因为它超出了某些条件。

如果这样做,事实上,闻起来很糟糕(我怀疑它确实如此),怎么会实现这个呢?

2 个答案:

答案 0 :(得分:6)

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

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

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

请注意OP: 请参阅this code,了解此答案的作者是如何正确推导出来的。

答案 1 :(得分:0)

既然你想在异常事件中运行“更多代码”,为什么不在finally中加入“更多代码”呢?这基本上就是最终的目的 - 即使发生异常也会保证执行

这样:

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

    ***// more code here***

    DoSomething();
    throw;
}

存储ex并抛出ex;将吞下内心的考验。你想扔;确保吞没堆栈中的任何内容。