Delphi - 尝试finally块是由编译器保证正确执行的吗?

时间:2011-08-25 14:07:55

标签: delphi exception try-catch delphi-2006 finally

我知道这也在其他主题上进行了讨论,我所问的正是这个问题的标题。

是否有这样的情况,当try / finally终于不会执行?

 try
  //some error here
 finally
  //code that MUST be executed
 end;

我不是在讨论如何使用try..except / finally块,我只想问这是否会发生。

LE:Application.Terminate /拔掉您的计算机是特殊情况。

4 个答案:

答案 0 :(得分:22)

try..finally保证finally块中的代码将执行,而不管受保护块中发生的任何异常。如果在finally块可以执行之前杀死进程,这当然不适用,例如,通过TerminateProcess或关闭电源。受保护块中的无限循环也可能阻止finally块的执行。

答案 1 :(得分:4)

如果断电(例如,如果您拔下电脑并且没有电池并且没有连接到UPS),则很可能无法运行finally块。主要操作系统或驱动程序故障(例如BSOD)也可能导致此问题。但是,使用try..finally构造的整个想法是即使在finally块内引发异常(任何类型),也要运行try块。如果finally块中有exit语句,try块甚至会运行。

答案 2 :(得分:3)

如果您的应用导致DEP(数据执行保护)异常,我认为Windows不会允许您继续。您的进程将被破坏,而不执行finally部分。你的过程只是“消失”。但是,这与编译器执行或未执行的操作无关。

答案 3 :(得分:1)

一旦输入try / finally,finally块将在执行离开try / finally之前执行。