2

我知道它的设计,在 finally 块中我应该进行资源清理——这就是为什么不管异常处理代码是什么,finally 块总是被执行。但是“为什么”它会执行是我的问题?,这是在一次采访中问我朋友的,所以即使我在与他讨论后感到困惑,请澄清,提前谢谢。?

4

2 回答 2

5

这里的“为什么”可以概括为“因为这就是规范所说的;这就是它被设计、指定、实现、测试和支持的原因:因为他们想要总是执行的东西,不管异常处理代码是什么”。这有点像问“如果测试中的条件失败,为什么执行流向else块(如果有的话) ?”if

用途包括finally

  • 资源清理(Dispose()是一个重要的,但不是唯一的)
  • 记录/跟踪/分析我们完成的事实(无论成功与否)
  • 使状态再次一致(例如,重置isRunning标志)

有趣的是,我比我做更多。我希望在离开时发生一些事情是很常见的,但通常最好的办法是让它们向上冒泡。在异常期间我通常需要确保做的唯一一件事就是清理我造成的任何混乱——无论哪种方式我都需要这样做——所以我不妨使用and的组合来做到这一点(这实际上只是一个包装器反正周围)。finallycatchfinallyusingfinally

于 2013-08-23T07:25:26.960 回答
4

它几乎总是围绕资源清理——或者有时是恢复到合理状态的逻辑清理。

如果我打开文件句柄或数据库连接(或其他),那么当我离开那段代码时,无论我如何离开它,我都希望句柄关闭-无论是“正常”还是通过异常。

finally块只是为了给出“无论什么都执行这个1 ”的行为,这通常是有用的。


1好吧,在合理范围内。例如,如果进程突然终止,或者电源线被踢出,则不会。

于 2013-08-23T07:16:48.963 回答