exception-handling - Pascal(脚本)和异常控制流程

标签 exception-handling inno-setup pascal pascalscript

我正在使用 PascalScript innosetup 安装程序,但我看不到以下 block 的控制流向何处。

function Foo(): String;
begin
  Result := 'foo';
  RaiseException('...');
end;

procedure Test();
var
  Z : String;
begin
  Z := '';
  try
    Z := Foo();
  except
    Log(Z);
  end
end;

我的安装程序似乎表明正在使用 Foo 函数的 Result 设置 Z。我对“大多数”编程语言中异常的理解告诉我,赋值 Z := Foo() 不应该在异常情况下发生。

Foo 函数引发时,Z 是否仍应分配给?

最佳答案

可能它通过引用作为隐式第一个参数来处理结果值。但是这可能会发生。它可以被认为是某些代码生成/优化的合法方式,因为它是处理返回值的一种非常常见的方式。

但是,除了测试 Delphi 所做的之外,Object Pascal 中的确切定义是模糊的领域,因为只有 x86 和 x86_64 实现。 Delphi 将返回 eax 中的值,因此如果您遵循该逻辑,这是非法的。


稍后添加:

我用结构化类型测试了 Delphi,当它传递一个引用时,它会在堆栈上创建一个副本来传递它。

虽然这可能会使优化结构化类型的代码变得困难,但是如果需要的话,声明返回类型 const 的修饰符/属性可以解决这个问题。

关于exception-handling - Pascal(脚本)和异常控制流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38459524/

相关文章:

windows-phone-7 - 如何知道WebClient/DownloadStringCompletedEventArgs的错误异常类型?

iphone - 实现 Testflight.com 和 Flurry.com 异常处理

c# - Service Fabric 未处理的异常和最佳实践

html - 在 Inno Setup Pascal 脚本中将 HTML 十六进制颜色转换为 TColor

typescript - 从 Inno Setup 中的文本文件读取应用程序版本

dll - Inno 脚本从互联网异步下载文件

delphi - 德尔福 Sprite (旋钮)

Linux - XFCE4 - Lazarus 系统热键

java - 为什么Exception.fillInStackTrace返回Throwable?

sql-server - 创新设置: add GUI to connect to SQL