在try / catch块之后使用finally块与编写代码

时间:2011-09-15 06:10:03

标签: exception-handling try-catch finally

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

1:

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

2:

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

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

3 个答案:

答案 0 :(得分:12)

嗯,首先,如果“句柄异常”部分本身抛出异常,则不会进行清理。

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

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

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

编辑:正如dj aqeel的回答所述,如果块完成而没有例外,也会执行finally语句,例如:通过return声明。我忘记了这一事实是赞成finally的一个很好的理由:它促进一致性。无论块如何退出,它都是执行清理的一致场所。

另请注意,在C#中,您习惯性地将using语句用于可支配资源。 Java 7有try-with-resources语句。

答案 1 :(得分:9)

因为finally块中的代码总是执行,即使你有try语句或catch块中的return语句,异常或其他控制离开语句......最后总是会执行除了你之前关闭机器之外的任何情况终于阻止了。 :)

答案 2 :(得分:0)

因为“终于”清楚地表明你正在进行清理工作。