![]() |
Delphi-Version: XE2
Wann werfe ich welche Exception?
Hallo-
Gibt eine Liste an Best Practices wann welche Exception geworfen werden sollte? In den Weiten des Internets finde ich manchmal Listen mit Exception-Typen die es in meinem XE2 schon garnicht mehr gibt oder umbenannt wurden... Konkretes Beispiel: Ich möchte etwas mittels
Delphi-Quellcode:
auf die serielle Schnittstelle schreiben. Gibt diese Windows-Methode false zurück, möchte ich eine Exception werfen. Liege ich damit
WriteFile
Delphi-Quellcode:
richtig?
EWriteError
Und wenn ich im Urlaub bin, sollte wahrscheinlich direkt beim Start
Delphi-Quellcode:
geworfen werden...
EProgrammerNotFound
|
AW: Wann werfe ich welche Exception?
Zitat:
|
AW: Wann werfe ich welche Exception?
Das hängt von deinem Programmfluss selber ab und ob du diese Ausnahme (Exception) behandeln kannst/willst.
Nicht jede Exception bedeutet zwingend, dass alles für die Katz ist. Hier mal ein kleines Beispiel:
Delphi-Quellcode:
Beispiel-Lauf:
program ExceptionTest;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type ECalcError = class( Exception ); procedure LogCalc( a, b, r : Integer ); begin Write( a, ' div ', b, ' = ' ); if a div b <> r then raise ECalcError.CreateFmt( '%d div %d <> %d', [a, b, r] ); Writeln( r ); end; procedure TestRun; var LIdx : Integer; begin try for LIdx := 1 to 10 do begin try LogCalc( Random( 10 ), Random( 10 ), Random( 2 ) ); except on E : ECalcError do begin Writeln( 'Das war wohl nix (', E.Message, ')' ); end; end; end; except Writeln( 'Fehler' ); raise; end; end; begin try Randomize; TestRun; except on E : Exception do begin Writeln( E.ClassName, ': ', E.Message ); end; end; ReadLn; end.
Code:
6 div 4 = 1
5 div 9 = Das war wohl nix (5 div 9 <> 1) 0 div 5 = 0 6 div 6 = 1 8 div 1 = Das war wohl nix (8 div 1 <> 0) 9 div 4 = Das war wohl nix (9 div 4 <> 1) 2 div 0 = Fehler EDivByZero: Division durch Null |
AW: Wann werfe ich welche Exception?
Hallo, das ist mir mehr oder weniger klar. :)
Ich möchte meine Methoden nur so gestalten, dass sie Exceptions werfen, die jemand anderes auch erwarten würde. Delphi-Methoden müssen ja leider (im Gegensatz zu Java) nicht zwingend kenntlich machen, was sie werfen können. Ich frage mal so: Werde ich drumherum kommen, mir zu allen in
Delphi-Quellcode:
definierten Exception die aktuelle Hilfe anzuschauen, versuchen es mir zu merken und weiterhin unsicher sein?
System.SysUtils
|
AW: Wann werfe ich welche Exception?
Hmmm, also wenn dein Code nicht weiterkommt, weil da etwas aufgetaucht ist, was so nicht sein soll/darf, dann gibt man eine Rückmeldung.
Entweder man hat eine
Delphi-Quellcode:
, die als Result diese Rückmeldung liefert oder man wirft eine Exception.
function
Am besten ist es, für eigene Klassen/Frameworks auch eigene Exception-Klassen zu definieren und in der Dokumentation zu vermerken, wann diese Exceptions geschmissen werden. BTW: Eine Exception ist eine Ausnahme, erwartet wird sowas idR nicht ;) |
AW: Wann werfe ich welche Exception?
Es kommt auch auf die Grösse des Projekts an.
Bei kleineren Projekten kann man ohne weiteres Exceptions direkt so auslösen:
Delphi-Quellcode:
Da die Anzahl der raise - Anweisungen relativ klein ist, weiss man schon anhand des Fehlertextes wo man suchen muss.
raise Exception.Create('Fehler beim Laden der Konfiguration');
Bei grossen und sehr grossen Anwendungen gibt es so viele Stellen im Sourcecode an denen eine Exception ausgelöst wird, dass man unmöglich alle im Kopf haben kann. Dann ist es sehr hilfreich wenn man eigene Exception-Klassen einführt (z.B. EImportError, EXmlError, ...). Diese Exception-Klassen leitet man meist direkt von der Klasse Exception ab, da die anderen in SysUtils definierten Klassen nur recht selten passen. Bei richtig grossen Anwendungen wird man die (nichtabgefangene) Exception nicht nur anzeigen, sondern man wird
Delphi-Quellcode:
und
Classname
Delphi-Quellcode:
der Exception in eine Logdatei schreiben.
Message
Hier zahlt es sich dann aus, wenn man je nach "Bereich" oder Fehlerart eine eigene Exceptionklasse hat und so gleich weiss wo man suchen muss. |
AW: Wann werfe ich welche Exception?
Hallo,
schau dir mal folgende beiden Dokumente an, vielleicht helfen die dir weiter ![]() ![]() Grüße |
AW: Wann werfe ich welche Exception?
Danke, vor allem ersteres ist genau, was ich meinte :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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