Delphi-Quellcode:
except
on E:
Exception do begin
E.
Message := '
My Message: ' + E.
Message;
raise;
end;
end;
Aber hier geht es nur wenn es eine "echte" Delphi
Exception ist, dann z.B. bei einer EAccessViolation wird im Raise wieder die "originale" Windows-
Exception ausgelöst und der Message-Text geht verloren.
also
Delphi-Quellcode:
except
on E:
Exception do
raise ExceptClass(E.ClassType).Create('
My Message: ' + E.
Message);
end;
Aber vielleicht ist es besser, wenn man stattdessen mit InnerExceptions arbeitet,
denn in deiner neuen
Exception fehlen eventuelle Zusatzinfos. (z.B. der ErrorCode einer EOSException oder die Adressen der EAccessViolation)
Oder du implementierst eine Assign-Funktion für "alle" Typen oder pfuschst etwas mit
RTTI rum (aber da würde auch Einiges fehlen, wie z.B. der interne Record-Pointer bei EExternal/EAccessViolation/EStackOverflow/...)
Delphi-Quellcode:
type EMyException =
class(
Exception);
procedure TForm3.FormCreate(Sender: TObject);
begin
try
try
OutOfMemoryError;
except
on E:
Exception do
Exception.RaiseOuterException(EMyException.Create('
Blubb'));
end;
except
on E:
Exception do
ShowMessage(E.ClassName + '
: ' + E.
Message + sLineBreak
+ E.InnerException.ClassName + '
: ' + E.InnerException.
Message);
// mit E.BaseException bekommt man die ursprüngliche/innerste Exception
// und mit einer Schleife über InnerException alle Anderen.
end;
end;