我知道这个问题在其他话题上也有讨论,但我想问的正是这个问题的标题。
有没有这样的情况,即try/finally中finally不会执行?
try
//some error here
finally
//code that MUST be executed
end;
我不是在谈论try..except/finally块的使用,我只是想知道这是否可能发生。
更新:Application.Terminate/拔掉计算机是特殊情况。
我知道这个问题在其他话题上也有讨论,但我想问的正是这个问题的标题。
有没有这样的情况,即try/finally中finally不会执行?
try
//some error here
finally
//code that MUST be executed
end;
我不是在谈论try..except/finally块的使用,我只是想知道这是否可能发生。
更新:Application.Terminate/拔掉计算机是特殊情况。
try..finally
保证 finally 块中的代码将会执行,无论受保护块中是否发生异常。当然,在 finally 块能够执行之前如果进程被终止,例如通过 TerminateProcess
或关闭电源,则该规则不适用。在受保护块中的无限循环也可能阻止 finally 块的执行。
如果电源中断(例如,您拔掉计算机的插头并且它没有电池并且未连接到UPS),那么很可能 finally
块将不会运行。主要的操作系统或驱动程序故障(例如BSOD)也可能导致这种情况发生。然而,try..finally
结构的整个思想是,即使在 try
块内引发了任何类型的异常,finally
块也必须运行。即使在 try
块内有一个 exit
语句,finally
块也将运行。
try
内部触发了通常的raise ESomeException.Create(...)
(并且没有发生其他事情,比如计算机被吸入黑洞之类的),你是可以“保证”finally
块会运行的。 - Andreas Rejbrand如果您的应用程序引起了DEP(数据执行预防)异常,我认为Windows将不允许您继续。您的进程将被强制退出,而无法执行最终部分。您的进程会完全“消失”。然而,这与编译器是否做了什么没有任何关系。
一旦进入try/finally块,无论如何,在执行离开try/finally之前,finally块都将被执行。