Himitsu, ich kann das gerade wirklich nicht glauben. Ich hätte gewettet, dass du
AcquireExceptionObject kennst. Bezüglich Freigabe der
Exception ohne genannte Funktion schaue man in System.pas:
Delphi-Quellcode:
//_HandleAnyException - selbiges in _HandleOnException
JMP EBX
//zum Handler springen
@@exceptFinally:
JMP _HandleFinallyInternal
@@destroyExcept:
{ we come here if an exception handler has thrown yet another exception }
{ we need to destroy the exception object and pop the raise list. }
CALL SysInit.@GetTLS
MOV ECX,[EAX].RaiseListPtr
MOV EDX,[ECX].TRaiseFrame.NextRaise
MOV [EAX].RaiseListPtr,EDX
MOV EAX,[ECX].TRaiseFrame.ExceptObject
JMP TObject.Free
Sobald eine
Exception also einen Except-Block verlässt (Reraise offensichtlich ausgenommen), wird die alte
Exception freigegeben, AcquireExceptionObject natürlich ausgenommen.
Die von dir angesprochene Raiselist ist in einem anderen Fall wichtig:
Delphi-Quellcode:
try
raise EFirstException.Create('
');
except
//die aktuelle Exception ist eine EFirstException
try
raise ESecondException.Create('
');
except
//die aktuelle Exception ist eine ESecondException
end;
//die ESecondException ist zerstört worden: die EFirstException ist jetzt aktuell
end;