Mientras navega System.Zip (Delphi XE2) para ver cómo funciona, me encontré con esta función:¿Qué significa `en ReturnAddress` en Delphi?
procedure VerifyWrite(Stream: TStream; var Buffer; Count: Integer);
begin
if Stream.Write(Buffer, Count) <> Count then
raise EZipException.CreateRes(@SZipErrorWrite) at ReturnAddress;
end;
Es la parte at ReturnAddress
ese tipo de me intriga.
No sabía que at
era una palabra clave válida (el marcador de sintaxis tampoco parece reconocerlo).
Según el IDE, se declara como System.ReturnAddress
, pero solo puedo encontrarlo declarado como una etiqueta en algún lugar del código (asm) de procedure _HandleAnyException;
. Sin embargo, la unidad del sistema está llena de referencias.
Así que lo que me gustaría saber es esto:
- ¿Cuál es
ReturnAddress
? - ¿Qué hace exactamente
Raise Exception.Create ... at ReturnAddress
do?
Bonuspoints si puede dar un ejemplo del mundo real de dónde podría ser una construcción útil, o si puede aconsejar no usarlo.
@ain: Gracias por la asistencia de formateo. No quiso eliminar el hecho de que editó; solo quería recalcar la última frase del texto citado. :) –
Y el uso del mundo real para este constructo generalmente es si usa una función * helper * para generar una excepción. En el VCL, por ejemplo, está 'TList.Error', de donde provienen todos los errores' TList'. Saber que se generó una excepción en esa función no es útil para la depuración, por lo que utiliza la sintaxis 'at' para devolver la dirección de excepción a la función que llamó' Error', por lo que cuando busca la dirección en su archivo de mapa, tienes una mejor idea de quién fue el culpable. (¿Y por qué usar un ayudante? Por un lado, mantiene el codegen de los llamadores más simple.) –
@RobKennedy: ¿No mostraría la pila de llamadas la misma información? – afrazier