Delphi “at ReturnAddress”在德尔福是什么意思?
在浏览System.Zip(Delphi XE2)查看其工作原理时,我发现了以下功能: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; 过程验证
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;