2009-09-12 4 views
8

Da un blocco finale, è possibile dire che è stata sollevata un'eccezione?Come posso sapere se sono in uno stack di eccezioni Delphi?

+0

Stai chiedendo se sei un e nel blocco 'finally' * perché * è stata sollevata un'eccezione, o solo se esiste un'eccezione * da qualche parte * nel programma, come quando si inserisce un blocco' try-finally' da una sezione 'except'? –

risposta

18

si potrebbe verificare se ExceptObject o ExceptAddr vengono assegnati . Nel sorgente VCL questo è fatto per esame. in GIFImg.pas o jpeg.pas.

Il seguente codice dovrebbe uscita

ExceptObject <> nil
ExceptObject = nil

e se si rimuove l'eccezione poi, naturalmente,

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

Ehi, piacere di vederti qui! –

3

Questa è una specie di trucco, ma è possibile provare a chiamare AcquireExceptionObject. Se ti trovi in ​​uno stato di eccezione, otterrai un valore di ritorno, altrimenti otterrai zero.

(. Se avete ricevuto uno, assicuratevi di chiamare ReleaseExceptionObject dopo)

2

per quanto ne so questo può essere raggiunto solo con istruzioni try nidificate:

Try 
    Try 
    ... 
    Except 
    ... 
    End; 
Finally 
    ... 
End