Während ich meine erste "ernsthafte" C ++ - Bibliothek entwerfe, frage ich mich:
Ist es gut, Ausnahmen von std::exception
und Nachkommen abzuleiten ?!
Auch nach dem Lesen
- Entwerfen von Ausnahmeklassen
- Was ist eine "gute Anzahl" von Ausnahmen, die für meine Bibliothek implementiert werden müssen?
Ich bin mir immer noch nicht sicher. Weil ich als Bibliotheksbenutzer neben der üblichen (aber möglicherweise nicht guten) Praxis davon ausgehen würde, dass eine Bibliotheksfunktion std::exception
s nur dann auslöst, wenn Standard-Bibliotheksfunktionen in der Bibliotheksimplementierung fehlschlagen, und nichts dagegen tun kann. Aber immer noch, wenn ich Anwendungscode schreibe, ist das für mich sehr praktisch, und meiner Meinung nach sieht es auch gut aus, einfach einen zu werfen std::runtime_error
. Auch meine User können sich ebenfalls auf die definierte Mindestschnittstelle verlassen, wie zum Beispiel what()
oder Codes.
Und zum Beispiel, mein Benutzer liefert fehlerhafte Argumente, was wäre bequemer, als ein zu werfen std::invalid_argument
, nicht wahr? So kombiniert mit der noch häufigen Verwendung von std :: exception sehe ich in anderen Code: Warum nicht noch weiter gehen und von Ihrer benutzerdefinierten Ausnahmeklasse (zB lib_foo_exception) und auch von ableiten std::exception
.
Gedanken?
lib_foo_exception
Klasse davon ableitet std::exception
, lib_foo_exception
nur fangen würde std::exception
, zusätzlich dazu, wenn er nur die Bibliothek fängt. Also könnte ich auch fragen, ob meine Bibliotheksausnahmestammklasse von std :: exception erbt .
lib_foo_exception
?" Mit dem Erben von std::exception
können Sie es durch catch(std::exception)
ODER durch tun catch(lib_foo_exception)
. Ohne Ableitung aus std::exception
, würden Sie es fangen , wenn und nur wenn durch catch(lib_foo_exception)
.
catch(...)
. Es ist vorhanden, weil die Sprache den von Ihnen in Betracht gezogenen Fall (und das "schlechte Benehmen" von Bibliotheken) berücksichtigt, aber dies ist keine moderne Best Practice.
catch
Sites und ebenso gröbere Transaktionen anzuregen, die eine Benutzerendoperation modellieren. Wenn Sie es mit Sprachen vergleichen, die die Idee des generalisierten Fangens von nicht fördern std::exception&
, haben sie beispielsweise oft viel mehr Code mit Zwischenblöcken try/catch
, die mit sehr spezifischen Fehlern behaftet sind, was die Allgemeingültigkeit der Ausnahmebehandlung etwas verringert, wenn sie beginnt zu platzieren Eine viel stärkere Betonung liegt auf der manuellen Fehlerbehandlung und auch auf allen unterschiedlichen Fehlern, die möglicherweise auftreten können.
std::exception
nicht Sie bedeutet werfen einstd::exception
. Auchstd::runtime_error
erbt vonstd::exception
in erster Linie, und diewhat()
Methode kommtstd::exception
nicht vonstd::runtime_error
. Und Sie sollten auf jeden Fall Ihre eigenen Ausnahmeklassen erstellen, anstatt generische Ausnahmen wiestd::runtime_error
.