Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi “at ReturnAddress”在德尔福是什么意思?_Delphi_Exception - Fatal编程技术网

Delphi “at ReturnAddress”在德尔福是什么意思?

Delphi “at ReturnAddress”在德尔福是什么意思?,delphi,exception,Delphi,Exception,在浏览System.Zip(Delphi XE2)查看其工作原理时,我发现了以下功能: procedure VerifyWrite(Stream: TStream; var Buffer; Count: Integer); begin if Stream.Write(Buffer, Count) <> Count then raise EZipException.CreateRes(@SZipErrorWrite) at ReturnAddress; end; 过程验证

在浏览System.Zip(Delphi XE2)查看其工作原理时,我发现了以下功能:

procedure VerifyWrite(Stream: TStream; var Buffer; Count: Integer);
begin
  if Stream.Write(Buffer, Count) <> Count then
    raise EZipException.CreateRes(@SZipErrorWrite) at ReturnAddress;
end;
过程验证写入(流:TStream;变量缓冲区;计数:整数);
开始
如果Stream.Write(缓冲区、计数)计数,则
在ReturnAddress处引发EZipException.CreateRes(@SZipErrorWrite);
结束;
让我困惑的是返回地址的
部分

我不知道
at
是一个有效的关键字(语法高亮显示器似乎也无法识别它)

根据IDE,它声明为
System.ReturnAddress
,但我只能在
过程的(asm)代码中的某个地方找到它声明为标签\u HandleAnyException。不过,系统单元中充满了对它的引用

所以我想知道的是:

  • 什么是
    ReturnAddress
  • 究竟是什么引起了异常。创建。。。在返回地址
  • do?
    如果你能给出一个真实的例子,说明这是一个有用的构造,或者你能建议不要使用它,那就值得一提。

    ReturnAddress
    VerifyWrite
    完成后将返回的地址

    引发异常。创建。。。at ReturnAddress
    表示当显示异常对话框时,它会将异常地址指示为位于
    ReturnAddress
    。换句话说,异常消息将读取在以下位置引发的异常:

    下面是Delphi7帮助文件的摘录。几乎和我的一样

    要引发异常对象,请使用异常的实例 使用raise语句初始化。比如说,

    raise EMathError.Create;
    
    一般来说,加薪声明的形式是

    raise object at address
    
    其中object和at address都是可选的;看见 我们提出了例外情况。指定地址时, 它可以是任何计算结果为指针的表达式 类型,但通常是指向过程或函数的指针。 例如:

    raise Exception.Create('Missing parameter') at @MyFunction;
    
    使用此选项从先前的点引发异常 在堆栈中,该值大于实际发生错误的值


    特别注意最后一句话。关于
    at

    ReturnAddr
    的使用非常具体,与以前的Delphi版本相比,它不是一个难题。考虑下一个测试(Delphi XE):

    若按调试器下的按钮3并按异常消息框中的“中断”,调试器将在

    procedure TForm1.Button3Click(Sender: TObject);
    begin
      RaiseTest1; // <-- here
    end;
    
    procedure RaiseTest2;
    begin
      raise Exception.Create('OOPS!');  // <-- here
    end;
    
    程序TForm1.按钮3点击(发送方:TObject);
    开始
    
    提高测试1;//@艾因:谢谢你的格式化帮助。不是要删除您编辑的事实,只是想强调引用文本的最后一句话。:)这个构造的实际用途通常是使用helper函数引发异常。例如,在VCL中有
    TList.Error
    ,所有与
    TList
    相关的错误都来自这里。知道在该函数中引发了异常对调试没有帮助,因此它使用
    at
    语法将异常地址放回调用
    Error
    的函数中,因此当您在映射文件中查找地址时,您可以更好地了解肇事者。(为什么要使用助手?首先,它使调用方的代码更简单。)@RobKennedy:调用堆栈不会显示相同的信息吗?如果你有调用堆栈,@Afrazier,那当然。但是
    at
    语法自1995年就存在了。当时,MadExcept没有给你一份客户提供的漂亮的崩溃报告。我不明白你认为什么语法发生了变化。@RobKennedy我想他指的是从
    ReturnAddr
    ReturnAddress
    ,但我找不到任何相关文档。但似乎
    ReturnAddr
    是系统单元中嵌套函数的名称(参见此)。
    procedure RaiseTest2;
    begin
      raise Exception.Create('OOPS!');  // <-- here
    end;