2009-09-12 71 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