On Mon, 27 Mar 2023, Luca Olivetti via lazarus wrote:
El 27/3/23 a les 17:26, Luca Olivetti via lazarus ha escrit:
El 27/3/23 a les 16:50, Michael Van Canneyt ha escrit:
Ehm. In case of an exception, ut will never be freed ?
That's what I said.
I was looking for a way to free it *and* raise the exception in the
context of the main thread.
If I move the ut.free before the raise, the exception has already
been freed and it's invalid, causing a sigsev, if I enclose it in a
try..finally the exception handler will be called after the finally
has freed the thread (and the exception, so it's the same problem).
Normally, I'd do
Raise
Exception(ut.fatalexception.classtype).Create(ut.fatalexception.message);
Actually I'd have to first create the exception, then free ut, then
raise the exception (keep in mind that FatalException is a TObject and
it isn't necessarily of class Exception), otherwise a direct raise as
you wrote would not free ut.
I only gave the line to show that you can raise a second exception object
with the same class and message as the original.
MyException:=nil;
if ut.FatalException<>nil then
begin
if ut.FatalException is Exception then
MyException:=Exception(ut.FatalException).Create(Exception(ut.FatalException).message)
Ouch, I left out the ClassType, but if I change it to
MyException:=Exception(Exception(ut.FatalException).ClassType).Create(Exception(ut.FatalException).message)
it's an instant segfault.
My bad, I made a typo, it should have been
MyException:=ExceptionClass(ut.FatalException).ClassType).Create(Exception(ut.FatalException).message)
with
ExceptionClass= class of exception;
Actually, I never write it like this in one statement, I save the class pointer
and message
in local variables, do cleanup first and then use the class pointer and
message later to raise an exception. But the effect is the same: you create
a copy with the same class and message as the original.
Michael.
--
_______________________________________________
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus