![]() |
Delphi-Version: 5
Exception mit gleichem Typ nochmal auslösen
Hallo zusammen
Ich habe möchte eine eine Exception erneut auslösen und dabei den Typ der Exception beibehalten. Allerdings möchte ich der Meldung etwas hinzuüfgen. Also:
Delphi-Quellcode:
Mache ich nur eine "raise", dann wird halt die Exception nochmal ausgeführt. Ich überlege wie es gehen könnte. Müsste irgendwi so sein:
try
// Do some stuff except raise <same exception (type) with additional information> end;
Delphi-Quellcode:
Ich hoffe es ist verständlich. Hat da irgerndwer eine Idee?
try
// Do some stuff except on E: Exception do raise <exception typ>.Create('My Message: " + E.Message); end; Alex |
AW: Exception mit gleichem Typ nochmal auslösen
Delphi-Quellcode:
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.
except
on E: Exception do begin E.Message := 'My Message: ' + E.Message; raise; end; end; 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; |
AW: Exception mit gleichem Typ nochmal auslösen
Hallo Himitsu
Danke. Funktioniert perfekt. Die zweite Lösung scheint mir die zuverlässigere zu sein. |
AW: Exception mit gleichem Typ nochmal auslösen
Zitat:
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin try raise EInOutArgumentException.Create('Der Text', 'C:\irgendwo'); except on E: EInOutArgumentException do ShowMessage(Format('%s:'#10'%s'#10#10'Pfad="%s"', [E.ClassName, E.Message, E.Path])); end; try try raise EInOutArgumentException.Create('Der Text', 'C:\irgendwo'); except on E: Exception do raise ExceptClass(E.ClassType).Create('My Message:'#10 + E.Message); end; except on E: EInOutArgumentException do ShowMessage(Format('%s:'#10'%s'#10#10'Pfad="%s"', [E.ClassName, E.Message, E.Path])); end; try try raise EInOutArgumentException.Create('Der Text', 'C:\irgendwo'); except on E: Exception do begin var E2 := ExceptClass(E.ClassType).Create('My Message:'#10 + E.Message); if E2 is EInOutArgumentException then EInOutArgumentException(E2).Path := EInOutArgumentException(E).Path; raise E2; end; end; except on E: EInOutArgumentException do ShowMessage(Format('%s:'#10'%s'#10#10'Pfad="%s"', [E.ClassName, E.Message, E.Path])); end; end;
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin try if not FileCreate('C:\nicht da\himitsu', fmOpenRead, 0) = 0 then RaiseLastOSError; except on E: Exception do //if E.Message = 'Systemfehler. Code: 3.'#$D#$A'Das System kann den angegebenen Pfad nicht finden' then // Das passt so natürlich nur im deutschen Windows if (E is EOSError) and (EOSError(E).ErrorCode = {3}ERROR_PATH_NOT_FOUND) then // Winapi.Windows.pas ShowMessage('Pfad nicht gefunden') else if (E is EOSError) and (EOSError(E).ErrorCode = {5}ERROR_ACCESS_DENIED) then ShowMessage('Zugriff verweigert') else if E is EOSError then ShowMessage(Format('%s'#10'%s'#10#10'ErrorCode=%d'#10'ErrorText="%s"', [E.ClassName, E.Message, EOSError(E).ErrorCode, SysErrorMessage(EOSError(E).ErrorCode)])) else ShowMessage(Format('%s'#10'%s', [E.ClassName, E.Message])); end; end; |
AW: Exception mit gleichem Typ nochmal auslösen
Musste eine Weile rumspielen bis ich kappiert habe was Du mir sagen willst :-).
Hast recht! Aber mir ging es eigentlich nur darum deb Exception-Typ zu belassen, da ich verschiedene Exceptions in den Debugger-Optionen ausgeblendet habe. Und wenn ich nicht meine eigene Kennung zu den Meldungen machen wird es später schwer zu wissen, wo genau ein Fehler passiert ist... |
AW: Exception mit gleichem Typ nochmal auslösen
Zitat:
Delphi-Quellcode:
raise ExceptClass(E.ClassType).Create('My Message:'#10 + E.Message) at ExceptAddr;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz