异常处理 – 在try/catch块之后使用finally块与写入代码

据我了解,以下两个例子应该做同样的事情.为什么第一个被认为更好?

1:

try {
  riskyMethod();
}
catch(Exception e) {
  //handle exception
}
finally {
  cleanUp();
}

2:

try {
  riskyMethod();
}
catch(Exception e) {
  //handle exception
}
cleanUp();

编辑:该示例是在Java中,但我想知道一般的块的概念,如在任何语言中使用

最佳答案
好吧,首先,如果“句柄异常”部分本身抛出异常,则不会发生清理.

更重要的是,你应该几乎永远不会捕获所有异常.您应该捕获可以处理的非常具体的异常,并让其他异常冒出来.此时,如果要进行清理,则必须使用finally块.

目前还不清楚你正在使用什么语言,但如果它是Java那么已经存在差异,因为非异常异常(Throwable的其他子类)将最终清理你的第一个版本而不是你的第二个 – 但你不应该甚至一般都会捕获异常.

我个人发现我写的try / finally块比try / catch或try / catch / finally块多.我发现我真的很难处理异常……虽然有时我会抓住一个例外,只是为了将它转换为更适合我正在处理的抽象级别,然后重新抛出.

编辑:正如在dj aqeel的回答中所指出的,如果块在没有例外的情况下完成,则最终也会执行语句,例如:通过退货声明.事实上,我忘记了这一点,这是一个最终支持的理由:它促进了一致性.无论块如何退出,它都是执行清理的一致场所.

另请注意,在C#中,您可以使用using语句来表示可支配资源.而Java 7则有try-with-resources声明.

转载注明原文:异常处理 – 在try/catch块之后使用finally块与写入代码 - 代码日志