8

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

1:

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

2:

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

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

4

3 回答 3

12

好吧,一方面,如果“处理异常”部分本身引发异常,则不会发生清理。

更重要的是,您几乎应该捕获所有异常。您应该捕获可以处理的非常具体的异常,并让其他异常冒泡。此时,如果您希望清理仍然发生,则必须使用块。finally

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

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

编辑:正如 dj aqeel 的回答中所指出的,如果块异常finally地完成,例如通过语句,语句也会被执行。我忘记了这一点是一个很好的理由:它促进了一致性。无论块如何退出,它都是执行清理的一致位置。returnfinally

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

于 2011-09-15T06:13:07.010 回答
9

因为 finally 块中的代码始终会执行,即使您在 try 或 catch 块中有 return 语句、异常或其他控制离开语句...... finally 将始终在任何情况下执行,除非您在 finally 块之前关闭机器电源。:)

于 2011-09-15T06:16:49.733 回答
0

因为“终于”清楚地表明您正在这里进行清理。

于 2011-09-15T06:14:38.763 回答