2009-09-12 75 views
8

從finally塊中,是否有可能告訴異常已被提出?如何判斷我是否在Delphi特例堆棧中?

+0

你問你是否e在'finally'塊*中,因爲*異常已經引發,或者只是程序中是否存在異常*某處,例如當您從'except'節中輸入'try-finally'塊時? – 2009-09-13 01:42:49

回答

18

您可以檢查是否ExceptObject或ExceptAddr分配。 在VCL源代碼中,這是爲考試而完成的。在GIFImg.pas或jpeg.pas中。

下面的代碼應輸出

ExceptObject <>零
ExceptObject =零

和如果刪除了異常那麼當然

ExceptObject =零
ExceptObject =零

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

嘿,很高興在這裏見到你! – 2009-09-12 22:45:39

3

這是一種破解,但你可以嘗試調用AcquireExceptionObject。如果你處於異常狀態,你會得到一個返回值,否則你會得到零。

(如果你沒有得到一個,確保事後調用ReleaseExceptionObject)

2

AFAIK這隻能嵌套try語句來實現:

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