我正在使用 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/