Designfrage std::exception
-
invalid_argument bedeutet ein logik error. ein logik error ist etwas dass nie auftreten darf wenn der code korrekt ist.
sprich: einen NULL zeiger als Passwort uebergeben ist ein invalid_argument. ein falsches passwort ist ein runtime_error ein fehler der _immer_ auftreten kann egal wie perfekt der code ist. (zB file not found, security exceptions,...)
logic_errors zu werfen macht deshalb keinen sinn, weil man so logik fehler verstecken kann. ein logikfehler hat eliminiert zu werden. er darf in der release version nicht mehr vorhanden sein. wenn ich aber logic_error werfe, dann kommt das 1. nicht immer bei mir an, weil er bei vielen catches einfach gefangen wird und ich kann explizit logik errors ignorieren.
beide situationen sind furchtbar. ein assert dagegen, kann ich weder ignorieren noch uebersehen. und vorallem: ein assert kann teure operationen ausfuehren um zu sehen ob der code korrekt ist (zB kann assert nach jedem insert in einem baum testen ob der baum gebalanced ist).
-
Artchi schrieb:
Diese Unterscheidung finde ich schon sehr hilfreich, denn runtime_error ist eher ein Fehler auf Sprachebene und somit eher ein C++-Fehler (nenne ich jetzt mal so). Mit Laufzeitfehler ist also nicht zur Laufzeit gemeint, sondern die C++-Runtime (low level): nicht genug Hauptspeicher, Filehandler ist falsch, Pointer ist ungültig usw.
Hast du dafür eine Quelle? Im Moment tendiere ich doch eher dazu, das falsche Passwort (um mal bei dem Beispiel zu bleiben) als runtime_error anzusehen, denn ein logic_error ist es jedenfalls definitiv nicht. Warum sollte runtime_error für Fehler innerhalb der Runtime-Library reserviert sein, bzw. wo steht das?
-
19.1.1/1 schrieb:
The class logic_error defines the type of objects thrown as exceptions to report errors presumably detectable before the program executes, such as violations of logical preconditions or class invariants.
19.1.6/1 schrieb:
The class runtime_error defines the type of objects thrown as exceptions to report errors presumably detectable only when the program executes.
Der Standard sieht das alles genauso wie Shade Of Mine.