我知道这也在其他主题上进行了讨论,我所问的正是这个问题的标题。
是否有这样的情况,当try / finally终于不会执行?
try
//some error here
finally
//code that MUST be executed
end;
我不是在讨论如何使用try..except / finally块,我只想问这是否会发生。
LE:Application.Terminate /拔掉您的计算机是特殊情况。
答案 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之前执行。