【问题标题】:Try/Catch/Finally, use exception from Catch in Finally?Try/Catch/Finally,在 finally 中使用 Catch 的异常?
【发布时间】:2012-05-17 05:20:46
【问题描述】:

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

如果这确实闻起来很糟糕(我怀疑确实如此),那么人们将如何做到这一点?

【问题讨论】:

  • 你在 catch 内部的地方做了什么有用的事情,最后不允许完全删除 catch 并让异常传播?我想如果你 throw ex; 以后你抓住它时得到的信息会更少(比如来源等)。

标签: c# try-catch-finally


【解决方案1】:

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

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

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

来自 OP 的注释:请参阅 this code,了解此答案的作者让我正确得出的结论。

【讨论】:

  • 我仍然想在某处抛出异常。在这个例子中我应该把它扔到哪里?
  • '投掷;'在第二个 finally{} 块的末尾将重新抛出异常,使堆栈跟踪保持不变。
  • @TheEvilPenguin - 在第二个 finally 块的末尾抛出是一个语法错误。
  • @Jason - 任何发生的异常(或者你自己抛出)仍然会像往常一样抛出,并将传播到下一个 catch 块(假设你们最后没有发生异常)
  • @Jason - 如果DoSomething() 抛出异常,Save() 将运行,DoSomethingElse() 将运行并且仍然会抛出异常,则在链接代码中是。
【解决方案2】:

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

所以:

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

    ***// more code here***

    DoSomething();
    throw;
}

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

【讨论】:

  • 我在文末提到不能把所有代码都放在finally,因为它在一些条件语句之外。
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2011-10-31
  • 1970-01-01
  • 2011-03-28
  • 2013-12-16
相关资源
最近更新 更多