On 17.09.2013 17:18, Marcos Douglas wrote:
I implemented -- but not up to Git yet -- some like that:
procedure TghSQLHandler.DoOnException(E: Exception);
var
    NewEx: EghSQLError;
begin
    if Assigned(FOnException) then
      FOnException(Self, E)
    else
    begin
      NewEx := EghSQLError.Create(Self, E.Message);   // <<<
      NewEx.InnerException := E;                                  // <<<
      raise NewEx;
    end;
end;

So, if I recreate the Exception, it works in any cases. As you see, I
created a new property (InnerException) to save the original
exception to know what the real Exception happened...
But I think this introduces much more overhead to processing.


Can you access fields of the InnerException? Maybe it's a problem of
reraising an existing exception...

Yes, I have access but no, this is not the problem. I had coded
InnerException property after the problem to solve it, creating a new
Exception but not missing the original one.

Was just an idea that something got freed while you didn't expect it to get freed...

In my code I have classes that inherited from TghSQLHandler. This
class have the DoOnException method.
So DoOnException can be call many times in override methods. Maybe the
program "broke" the stack because "raise E" can be call and raise an
exception; the next "level" raise another; and next call again.  :/


Could possibly be. If you could reproduce it in an as simple example as
possible that would help.


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
In attachment.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Will take a look when I find the time (or someone else of the devs can take a look as well ^^)

Another thing you could try (just for testing): change your exception
handler procedure to a function that returns bool and use it like this:

=== code begin ===


procedure TghSQLConnector.Connect;
begin
   try
     FLib.Connect;
   except
     on E: Exception do
       if not DoOnException(E) then
         raise;
   end;
end;

=== code end ===


Regards,
Sven

The only difference is the use of raise; instead raise E; right?

Basically, yes. But "raise;" can only be used inside an "except ... end" block, so it would not compile inside your DoOnException method.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to