AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wann werfe ich welche Exception?

Offene Frage von "Der schöne Günther"
Ein Thema von Der schöne Günther · begonnen am 22. Mär 2013 · letzter Beitrag vom 6. Jun 2013
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Wann werfe ich welche Exception?

  Alt 22. Mär 2013, 10:14
Delphi-Version: XE2
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 WriteFile auf die serielle Schnittstelle schreiben. Gibt diese Windows-Methode false zurück, möchte ich eine Exception werfen. Liege ich damit EWriteError richtig?

Und wenn ich im Urlaub bin, sollte wahrscheinlich direkt beim Start EProgrammerNotFound geworfen werden...

Geändert von Der schöne Günther (22. Mär 2013 um 10:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wann werfe ich welche Exception?

  Alt 22. Mär 2013, 10:43
Zitat:
EWriteError ist die Exception-Klasse für fehlgeschlagene Versuche, Daten in einen Stream zu schreiben.
Je nachdem, wie Du schreiben möchtest, könnte das schon der richtige Typ sein. Im Zweifelsfall kannst Du Dir aber auch eigene Exceptions ableiten und dann diese benutzen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Wann werfe ich welche Exception?

  Alt 22. Mär 2013, 11:41
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:
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.
Beispiel-Lauf:
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Wann werfe ich welche Exception?

  Alt 22. Mär 2013, 12:03
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 System.SysUtils definierten Exception die aktuelle Hilfe anzuschauen, versuchen es mir zu merken und weiterhin unsicher sein?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Wann werfe ich welche Exception?

  Alt 22. Mär 2013, 12:10
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 function , die als Result diese Rückmeldung liefert oder man wirft eine Exception.

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Wann werfe ich welche Exception?

  Alt 22. Mär 2013, 12:51
Es kommt auch auf die Grösse des Projekts an.
Bei kleineren Projekten kann man ohne weiteres Exceptions direkt so auslösen: raise Exception.Create('Fehler beim Laden der Konfiguration'); Da die Anzahl der raise - Anweisungen relativ klein ist, weiss man schon anhand des Fehlertextes wo man suchen muss.

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 Classname und Message der Exception in eine Logdatei schreiben.
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.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Wann werfe ich welche Exception?

  Alt 6. Jun 2013, 13:03
Hallo,

schau dir mal folgende beiden Dokumente an, vielleicht helfen die dir weiter

http://www.nickhodges.com/post/On-th...erarchies.aspx
http://conferences.embarcadero.com/article/32156

Grüße
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Wann werfe ich welche Exception?

  Alt 6. Jun 2013, 13:06
Danke, vor allem ersteres ist genau, was ich meinte
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz