Durante la navigazione System.Zip (Delphi XE2) per vedere come funziona, ho trovato questa funzione:Cosa significa `a ReturnAddress 'in Delphi?
procedure VerifyWrite(Stream: TStream; var Buffer; Count: Integer);
begin
if Stream.Write(Buffer, Count) <> Count then
raise EZipException.CreateRes(@SZipErrorWrite) at ReturnAddress;
end;
E 'la parte at ReturnAddress
quella sorta di mi lascia perplesso.
Non sapevo che at
fosse una parola chiave valida (l'evidenziatore della sintassi non sembra riconoscerlo neanche).
Secondo l'IDE è dichiarato come System.ReturnAddress
, ma posso trovarlo solo come etichetta da qualche parte nel codice (asm) di procedure _HandleAnyException;
. L'unità di sistema è piena di riferimenti ad esso però.
Quindi quello che vorrei sapere è questo:
- Che cosa è
ReturnAddress
? - Che cosa fa esattamente
Raise Exception.Create ... at ReturnAddress
?
Punti bonus se si può dare un esempio reale di dove questo sarebbe un costrutto utile, o se si può evitare di usarlo.
@ain: Grazie per l'assistenza di formattazione. Non intendevo rimuovere il fatto che hai modificato, volevo solo sottolineare la frase finale del testo citato. :) –
E l'uso del mondo reale per questo costrutto è generalmente se si usa una * funzione di supporto * per sollevare un'eccezione. Nella VCL, ad esempio, c'è 'TList.Error', da cui provengono tutti gli errori relativi a' TList'. Sapere che un'eccezione è stata sollevata in quella funzione non è utile per il debug, quindi usa la sintassi 'at' per riportare l'indirizzo di eccezione nella funzione che ha chiamato' Error', quindi quando cerchi l'indirizzo nel tuo map file, hai un'idea migliore di chi fosse il colpevole. (E perché usare un aiutante? Per uno, semplifica i codegen dei chiamanti.) –
@RobKennedy: Lo stack di chiamate non rivelerebbe le stesse informazioni? – afrazier