2009-09-12 5 views
8

Kann innerhalb eines finally-Blocks festgestellt werden, dass eine Ausnahme ausgelöst wurde?Wie kann ich feststellen, ob ich in einem Delphi-Ausnahme-Stack bin?

+0

Fragen Sie, ob Sie sind e im 'finally'-Block * weil * eine Exception ausgelöst wurde, oder nur, ob es eine Ausnahme * irgendwo * im Programm gibt, zB wenn Sie einen' try-finally'-Block innerhalb eines 'except'-Bereichs eingeben? –

Antwort

18

Sie könnten überprüfen, ob ExceptObject oder ExceptAddr zugeordnet sind . In der VCL-Quelle wird dies zur Überprüfung durchgeführt. in GIFImg.pas oder jpeg.pas.

Der folgende Code ausgeben sollte

ExceptObject <> nil
ExceptObject = nil

und wenn Sie die Ausnahme entfernen dann natürlich

ExceptObject = nil
ExceptObject = nil

try 
    try 
     raise Exception.Create('Just an exception'); 
    finally 
     if ExceptObject <> nil then 
     WriteLn('ExceptObject <> nil') 
     else 
     WriteLn('ExceptObject = nil'); 
    end; 
    except 

    end; 
    if ExceptObject <> nil then 
    WriteLn('ExceptObject <> nil') 
    else 
    WriteLn('ExceptObject = nil'); 
+4

Hey, schön dich hier zu sehen! –

3

Dies ist eine Art Hack, aber Sie könnten versuchen, AcquireExceptionObject aufzurufen. Wenn Sie sich in einem Ausnahmezustand befinden, erhalten Sie einen Rückgabewert, andernfalls erhalten Sie null.

(. Wenn Sie einen bekommen haben, stellen Sie sicher, ReleaseExceptionObject danach zu nennen)

2

AFAIK kann dies nur mit verschachtelten try-Anweisungen erreicht werden:

Try 
    Try 
    ... 
    Except 
    ... 
    End; 
Finally 
    ... 
End 
Verwandte Themen