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