我认为willcode最接近表达这里的关键点,可能每个人都这么说但不清楚。
问题是您所问的问题确实存在很大问题:“如果我在 catch 块之后编写所有语句而不是将它们写入 finally 块,那么会有什么问题吗?”
如果你把所有语句写在 catch 块之后,你的意思是
1) 你总会捕捉到异常。
2) 捕获异常后,您将始终继续执行下一条语句。
这意味着您将始终“正常”地在出现异常后继续执行,这通常是您从不实际上想要做的事情。
例外应该就是这样 - 例外。如果您实际上可以处理异常,那么编写代码以首先考虑这些条件并且根本不导致异常总是更好。如果您遵循此模型,那么异常就是真正的异常——您无法预料或最多无法修复的情况。真的没有预料到是你应该努力的方向。 这意味着通常你无法处理真正的异常,这也意味着你不应该只是继续执行,而是经常结束应用程序。
通常的做法是允许错误传播回调用堆栈。有人说这是在链条中更高的人可能能够处理它的情况下完成的。我想说这基本上永远不会发生,这样做有两个真正的目的。一个可能是用户可以修复的东西,如果有的话。因此,您将错误传播回来,直到您到达可以将其报告给用户的位置。或者二,用户无法修复它,但您想获取整个调用堆栈以进行调试。然后你抓住它在顶部优雅地失败。
finally 块现在应该对你有更多的意义。正如每个人所说,它总是运行。 finally 最清晰的用法实际上是在 try... finally 块中。您现在所说的是,如果代码运行良好,那就太好了。我们仍然需要做一些清理,最后总是执行,然后我们继续。但是如果发生异常,我们现在真的需要 finally 块,因为我们可能仍然需要做一些清理工作,但是我们不再在这里捕获异常,所以我们将不再继续前进。 finally 块对于确保进行清理至关重要。
除非有一定的经验,否则总是会停止执行的异常的想法对于某人来说可能很难理解,但实际上这就是始终做事的方式。如果发生了错误,要么它太小了,你应该从一开始就考虑到它,或者有越来越多的错误等待发生。
“吞下”错误 - 捕获它们并继续前进是您能做的最糟糕的事情,因为您的程序变得不可预测,您无法找到并修复错误。
编写良好的代码将包含尽可能多的 try ... finally 块,以确保无论结果如何总是释放资源。但是编写良好的代码通常只包含少量的 try ... catch 块,这些块的存在主要是为了让应用程序尽可能优雅地失败,或者服从用户,这意味着至少总是将消息传递给用户等。但你通常不会只是捕捉到错误并继续前进。