我知道这也在其他主题上进行了讨论,我要问的正是这个问题的标题。
尝试/最终最终不会执行时是否存在这种情况?
try
//some error here
finally
//code that MUST be executed
end;
我不是在谈论必须如何使用 try..except/finally 块,我只是在问这是否会发生。
LE: Application.Terminate/unplug your computer are specific cases。
我知道这也在其他主题上进行了讨论,我要问的正是这个问题的标题。
尝试/最终最终不会执行时是否存在这种情况?
try
//some error here
finally
//code that MUST be executed
end;
我不是在谈论必须如何使用 try..except/finally 块,我只是在问这是否会发生。
LE: Application.Terminate/unplug your computer are specific cases。
try..finally
保证 finally 块中的代码将执行,而不管受保护块中发生任何异常。TerminateProcess
如果进程在 finally 块可以执行之前被终止,例如通过或关闭电源,这当然不适用。受保护块中的无限循环也可能会阻止 finally 块执行。
如果断电(例如,如果您拔下计算机并且它没有电池并且没有连接到 UPS),则该finally
块很可能不会运行。主要的操作系统或驱动程序故障(例如 BSOD)也可能导致此问题。但是,该try..finally
构造的整个想法是finally
即使在块内引发异常(任何类型的),该块也将运行try
。finally
如果块内有exit
语句,该块甚至会运行try
。
如果您的应用程序导致 DEP(数据执行保护)异常,我认为 Windows 不会允许您继续。如果不执行 finally 部分,您的进程将被破坏。您的过程只是“消失”。但是,这与编译器做了什么或没有做什么无关。
一旦进入 try/finally,finally 块将在执行离开 try/finally 之前执行。