【问题标题】:Delphi - try finally block is guaranteed by compiler to be executed correctly?Delphi - try finally 块由编译器保证正确执行?
【发布时间】:2011-11-03 17:51:45
【问题描述】:

我知道这也讨论过其他主题,我要问的正是这个问题的标题。

try/finally 不执行时是否存在这种情况?

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

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

LE:Application.Terminate/unplug your computer are specific case.

【问题讨论】:

  • 编译器在世界末日或您的 PC 之外不提供任何保证。无论什么都先到。但是在所有重要的情况下,即当 finally 块仍然可以做一些有用的事情时,它将被执行。
  • 我在看这个问题stackoverflow.com/questions/3484353/… - Java 开发人员似乎没有考虑虫洞/世界末日/等等。我必须承认 Delphi 开发人员很有幽默感

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


【解决方案1】:

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

【讨论】:

  • finally 块将开始执行。只是希望没有东西扔进街区。
  • 你想给他们都买啤酒吗?
  • @Henk 我经常看到的一个错误是将大量代码放入 finally。通常每个 finally 都应该处理一个对象。一旦你在 finally 块中有代码抛出,你就有麻烦了。当然,如果发生这种情况,它可能不是世界末日。也许你不在乎。
  • 我不允许。但是我看到很多不可靠的代码在 finally 中做了太多的事情。
  • @henk 说“你”实际上是指你的第三人称,而不是第二人称,即一个或法语。我讨厌英语的这种缺陷。或者也许是我无法发现我自己对它的厌恶缺乏补偿。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • @RBA:什么,很奇怪?编译器无法保证主机(硬件/操作系统/驱动程序)将正常运行...但是,我确实相信您“保证”finally 块在正常情况下运行raise ESomeException.Create(...) 被击中 try (没有其他事情发生,就像计算机被吸入黑洞或其他东西一样)。
    • +1。我会给“黑洞”参考另一个+1。如果我能。 :)
    • 请注意,当您的计算机被吸入黑洞时,由于未能完成“finally”部分而导致的内存泄漏,与可能出现的其他问题相比变得微不足道。
    【解决方案4】:

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

    【讨论】:

    • 一个相关的问题是finally中的所有代码都没有得到保证。例如,你可以在 finally 部分有 3 个语句,而你在第二个语句上炸了。第三条语句不会被执行。一个很好的例子是尝试释放未分配的对象。
    • 保证更强。退出、中断或继续超出 finally 将导致 finally 块运行。我认为 goto 也是如此,但我不知道,因为我从不使用 goto。也许@Andreas 知道,因为我见过他使用 goto! ;-)
    • 我怀疑 GOTO 会传递到 finally... 就像如果你 GOTO 进入 FOR 循环,循环计数器没有初始化。 GOTO 不像 CONTINUE、BREAK 和 EXIT 那样“结构化”。
    • @Chris,确实,保证会进入 finally 块,而不是运行完成。
    • 刚刚尝试过:从 try 块中转到 goto 将无法编译。这样就解决了该替代方案。即使是 asm 块中的 JMP 也不会编译。哇!
    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 2014-01-24
    • 2021-05-13
    • 1970-01-01
    • 2015-01-22
    • 2013-09-01
    • 2010-09-11
    • 1970-01-01
    相关资源
    最近更新 更多