所以我知道无论异常如何都会执行try/catch
代码块,但不使用它会不好?我一直在使用{{1}}并且想知道这是不是一种不好的做法。或者这不重要吗?
答案 0 :(得分:9)
如果你没有任何东西需要在最后清理,那就完全没问题了。 finally
块几乎始终关于资源清理......并且有很多时候您想要捕获异常,但没有任何资源可以清理。
话虽如此,只有当您可以实际处理它们或想要将它们包装在更合适的类型中时才捕获异常。我的经验是,catch块应该比try / finally或try-with-resources块少得多。如果您发现自己在大多数方法中发现异常,则可能表明您正在滥用它们。
答案 1 :(得分:6)
简短的回答,没有。这一切都取决于你的try块中发生了什么。我会说你的大部分尝试都可能最终不需要。但是,当您在try块中打开资源(例如文件,流,网络等)时必须关闭(无论是否抛出异常)
答案 2 :(得分:2)
Subdivision和Jon的答案很棒,但我只是想补充它们,澄清一下finally
块如何运作的常见误解,主要是这个常见问题的答案:
在finally
块中放置代码与在catch
块之后立即放置代码有什么区别?
错误答案: catch
块之后的代码在异常情况下不会执行,除非您将其放在finally
块中。
如果这不正确,为什么我们需要finally
?
首先,只要您正确处理所有异常,catch
阻止之后的代码就会运行,这意味着不应该例外逃避未处理的try..catch
。另一方面,finally
即使在未处理的异常转义为try..catch
的情况下,也会始终几乎。我说"几乎",因为一些未处理的异常可能会跳过finally
块,但这种情况很少见。
另一个区别是:如果您在try
或catch
块中退出代码,则catch
块之后的代码将不运行。我们可能认为这很明显,但有时可能会很棘手。示例:return
,break
和continue
(如果您的try
和后面的代码在循环中),throw
(如果您在catch
中使用它{1}}向调用者重新抛出异常)。 finally
仍将在所有这些条件下执行。
最后要考虑的一点是:finally
的使用清楚地表明了您的意图,因此它有助于提供更强大和自我解释的代码。如果您仔细处理上述所有条件并在catch
认为保证与finally
块一起运行后编写代码,那么您可能会很好......好吧,直到另一个开发人员需要在将来修改您的代码,并决定在return
中添加try
(例如)。
结论:如果您的代码需要保证在try..catch
之后执行,则始终建议您使用finally
。
答案 3 :(得分:0)
如果您的代码可能会产生错误,请将此代码放在try/catch
中。当我们添加finally
时,运行的代码不依赖于上面捕获的错误。
PS:始终执行'finally'
中包含的代码行。