Ich habe seit etwa 5 Jahren immer wieder in C++ programmiert. Warum habe ich noch nie gesehen, dass Ausnahmen verwendet werden, abgesehen von Beispielen um der Beispiele willen?
Antworten
Zu viele Anzeigen?Ich könnte dasselbe sagen und es wäre nicht sehr einseitig, wenn ich definiere, dass dies für eine Microsoft-Welt und RAD gilt.
Ich denke, das liegt daran, dass man heute nicht mehr C++-Programme an sich verwendet, sondern eher eine Mischung aus Hochsprache und C++-Bibliotheken. Und oft gibt es eine Grenze zwischen verwaltet und nicht verwaltet.
Das Werfen und Abfangen von Ausnahmen durch diese Grenze ist wie das Anzünden eines Feuerwerkskörpers in Ihrem Arsch :) - [lesen Sie Mem-Leck oder schlimmer]
Wenn Sie COM-Objekte verwenden, müssen Sie außerdem COM-Ausnahmen verwenden, so dass die Verwendung von Standard-C++-Ausnahmen intern in einer oft kleinen Bibliothek untergebracht werden muss. In kleinen Bibliotheken besteht keine Notwendigkeit, Ausnahmen zu verwenden.
Denn es gibt eine große Diskrepanz zwischen dem "realen" Code und dem "Lehrbuch"-Code.
Ich arbeite in einem "großen" Softwareunternehmen und kann Ihnen ehrlich sagen, dass die Dinge, die Sie in der Produktion sehen, fast 0 % der guten Praktiken folgen, über die Sie in guten Büchern lesen.
Nehmen Sie das Buch Effective C++ von Scott Meyers als Beispiel. Es sollte auf dem Schreibtisch jedes Softwareentwicklers von der Ost- bis zur Westküste liegen.
Hierfür gibt es mehrere Gründe:
- Ausnahmen sollten nicht sehr sichtbar sein, da sie so konzipiert sind, dass sie tief in den Eingeweiden einer Bibliothek ausgelöst und irgendwo weit oben im im Aufrufstapel (sogar so hoch wie main()).
Ich weiß nicht, was Sie mit "Ausnahmen sollten nicht sehr sichtbar sein" meinen. Aber ich stimme zu, dass Catch-Blöcke selten sein sollten - und das sind sie in der Regel in main.
- Sie sind dazu bestimmt, außergewöhnliche (d. h. seltene und unerwartete) Fehlern. Zum Beispiel ist das Versagen, eine Datei zu öffnen, nicht besonders außergewöhnlich. Daher löst die iostream-Bibliothek standardmäßig keine Ausnahme aus, wenn sie eine Datei nicht öffnen kann.
dass die iostream-Bibliothek keine Ausnahmen auslöst, macht sie irgendwie unbrauchbar. Fehler vor dem Aufrufer verstecken! Das ist so C-mäßig.
- Ausnahmen sind sehr teuer, was die Einhaltung der Regeln fördert. die Einhaltung der Entwurfsabsicht.
Normalerweise sind Ausnahmen für fehlgeschlagene Systemaufrufe. Da das Schreiben in eine Datei oder das Öffnen einer Datei nicht wirklich kostengünstig ist, würde man sich nicht darum kümmern, dass Exceptions teuer sind. Außerdem ist es teurer, den Erfolg zu prüfen, als die C++-Ausnahmebehandlung zu verwenden. Normalerweise würde man keinen try-catch-Block innerhalb eines zeitkritischen Teils des Codes erstellen.
- C++-Bibliotheken, die Ausnahmen auslösen, sind nicht i Programmen.
Was ist C? Ah ja - ich erinnere mich - etwas, das ich um 1996 aufgegeben habe. Erinnern Sie sich an Turbo Pascal?
Ich spreche von Desktop-Anwendungen für Windows. Nach meiner Beobachtung (YMMV zu), früheren Phase der Entwicklung wahrscheinlich bis zu den ersten Releases. Viele Entwickler denken nicht früh an Ausnahmen. Das ist der Grund, warum es nur wenige Codes mit Ausnahmebehandlung gibt, aber wenn Sie bereits 2 oder 3 Releases hatten oder sich in der Wartungsphase befinden, werden Ausnahmen aufgrund der verschiedenen Einsatzumgebungen durch Fehlerberichte von Kunden berücksichtigt.