在asp.net中执行finally块的确切原因是什么?我知道它是出于设计,在finally块中我应该进行资源清理

在asp.net中执行finally块的确切原因是什么?我知道它是出于设计,在finally块中我应该进行资源清理,asp.net,.net,c#-4.0,Asp.net,.net,C# 4.0,我知道它的设计,在finally块中我应该做资源清理-这就是为什么finally块总是被执行,不管异常处理代码是什么。 但“为什么”它会执行是我的问题,这是在一次采访中问我的朋友的,所以即使我在与他讨论后感到困惑,请澄清,提前感谢。?这几乎总是围绕着资源清理,或者有时是逻辑清理,回到合理的状态 如果我打开了一个文件句柄或一个数据库连接(或其他什么),那么当我离开那段代码时,我希望不管我是如何离开它的句柄都被关闭——不管它是“正常的”还是通过一个异常 最后块只是用来给出“不管发生什么都执行”的行为

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

这几乎总是围绕着资源清理,或者有时是逻辑清理,回到合理的状态

如果我打开了一个文件句柄或一个数据库连接(或其他什么),那么当我离开那段代码时,我希望不管我是如何离开它的句柄都被关闭——不管它是“正常的”还是通过一个异常

最后
块只是用来给出“不管发生什么都执行”的行为,这通常是有用的


1嗯,在合理范围内。例如,如果该过程突然终止,例如,如果电源线被踢出,则不会出现这种情况。

这里的“为什么”可以概括为“因为规范就是这么说的;这就是为什么它被设计、指定、实现、测试和支持的原因:因为他们希望无论异常处理代码是什么,都能始终执行。”. 这有点像问“如果
if
测试中的条件失败,为什么执行会流向
else
块(如果有)

finally
的用法包括:

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

有趣的是,我对
的使用比我对
catch的使用要多得多。我想在离开时发生一些事情是很常见的,但通常情况下,除了例外,最好的办法是让这些事情向上发展。在异常期间,我通常需要确保做的唯一一件事是清理我造成的任何混乱-我需要以任何一种方式进行清理-因此我最好结合使用
finally
using
(实际上这只是
finally
的包装器)。

请查看此处的信息: