Wann assert benutzen, wann Exception werfen und wann Fehlercodes verwenden?
-
Hallo Leute,
gibt es sinnvolle Richtlinien dafür, wann man assert verwenden sollte, wann man lieber eine Exception wirft oder einen Fehlercode zurückgibt?
Ein Fall, der mir spontan einfällt, wo man wahrscheinlich asserts verwenden würde: wenn es schnell gehen muss und man sich die Prüfung eines Arguments (z.B. Array-Index) nur im Debug-Build leisten kann und an das Werfen einer Exception gar nicht erst zu denken ist. Im Release-Build hätte man dann undefiniertes Verhalten, aber dafür auch maximale Geschwindigkeit ...
int& operator [](size_t index) const { assert(index < mySize); // oder: if(index >= mySize) throw IndexOutOfBoundsError("index", index, 0, mySize); // fortfahren // ... }assert vielleicht auch nur für klasseninterne Integritätsprüfungen (Invarianten)?
Dann gibt es ja noch die Möglichkeit, Fehler durch Fehlercodes zu übermitteln. Also im einfachsten Fall ein bool-Rückgabewert, der angibt, ob die Funktion erfolgreich war oder nicht.
Sollte man Fehlercodes in C++ überhaupt noch verwenden, oder sollte man alles mit Exceptions machen? Vorteil von den Exceptions ist ja, dass man sie nicht einfach ignorieren kann und dass man viele Infos hineinpacken kann, die man in einen simplen Fehlercode nicht reinkriegt.
-
es gab da sone regel die etwa so lautete:
Fehler, die vom Benutzer erzeugt werden können wie bspw. datei nciht gefunden, Eingabewert in falschem Bereich oder falsches Dateiformat etc. sollten mit Exceptions gefangen werden.
Fehler, die vom Programmierere gemacht werden, also index out of bounds, null-zeiger etc. werden mit asserts behandelt.
-
Danke schonmal, Maxi, ich habe meine ursprüngliche Frage noch um eine dritte Möglichkeit erweitert

-
@Maxi: Schonmal daran gedacht, daß Index-Überschreitungen auch vom Nutzer verursacht werden könnten?
@Absynth: Fehlercodes solltest du in C++ nicht verwenden - da hast du keine Kontrolle darüber, ob jemand darauf reagiert.
-
find exceptions schöner als fehlercodes. fehlercodes haben zwei nachteile:
- wie bereits erwähnt: man kann sie viel zu leicht ignorieren
- um rauszufinden, was die fehlercodes einer funktion bedeuten, muss man womöglich erstmal in die funktion reingucken oder nach defines suchen. exceptions sind typisiert. wenn ich also eine indexoutofbounds exception erhalte, weiss ich sofort, was das zu bedeuten hat.
-
CStoll schrieb:
@Maxi: Schonmal daran gedacht, daß Index-Überschreitungen auch vom Nutzer verursacht werden könnten?
in einer endnutzer applikation? dann ist es auf nen programmierfehler zurückzuführen

-
@CStoll: Ich denke, dass indexüberschreitungen eher intern geschehen. Wenn ich den Benutzer frage, welchen Datensatz er haben will, dann muss der vorherige Teil sagen, das ist ein falscher Index. In einem array oder vector bspw. hat ein throw bei indexüberschreitung nichts zu suchen. Meine Meinung. Da dann doch lieber ein assert.