views:

255

answers:

3

From within a finally block, is it possible to tell an exception has been raised?

+1  A: 

This is sort of a hack, but you could try calling AcquireExceptionObject. If you're in an exception state, you'll get a return value, otherwise you'll get nil.

(If you did get one, make sure to call ReleaseExceptionObject afterwards.)

Mason Wheeler
+2  A: 

AFAIK this can only be achieved with nested try statements :

Try
  Try
    ...
  Except
    ...
  End;
Finally
  ...
End
sdu
+14  A: 

You could check if ExceptObject or ExceptAddr are assigned. In the VCL source this is done for exam. in GIFImg.pas or jpeg.pas.

The following code should output

ExceptObject <> nil
ExceptObject = nil

and if you remove the exception then of course

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');
Uwe Schuster
Hey, nice to see you on here!
Mason Wheeler