8 Stimmen

Warum werden Ausnahmen in C++ so selten verwendet?

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?

15voto

Ben Voigt Punkte 268424

Hier sind Beobachtungsfehler im Spiel.

Ein erheblicher Teil des C++-Codes ist für die Systemprogrammierung und eingebettete Systeme bestimmt. (Schließlich ist C++ nur eine von vielen Optionen für die Anwendungsprogrammierung, und viele der Alternativen haben ausgefeiltere RAD-Umgebungen, aber bei der Systemarbeit ist es oft die Sprache auf höchster Ebene, für die ein Compiler verfügbar ist, und zwar mit großem Abstand). Und die meisten eingebetteten Systeme sowie ein beträchtlicher Teil der Systementwicklungsarbeit unterliegen Beschränkungen, die Ausnahmen ausschließen.

Wenn Sie aufgrund Ihres Schwerpunkts dazu neigen, diese Art von Code zu suchen, ist es durchaus möglich, dass der C++-Code, den Sie gesehen haben, keine Ausnahmen verwendet.

Das heißt nicht, dass es keinen C++-Code gibt, der Ausnahmen verwendet - es gibt ihn, und zwar eine ganze Menge davon. Er erscheint vielleicht nur nicht in Code, der Probleme lösen soll, die interessant sind für Sie .

9voto

Péter Török Punkte 111735

Ausnahmen sind eine ziemlich späte Ergänzung der Sprache, so dass ich glaube, dass viele C++-Entwickler nie gelernt haben, sie richtig zu benutzen, und sich vielleicht wohler fühlen, wenn sie traditionelle (C-artige) Fehlerbehandlungstechniken verwenden.

Ich persönlich halte sie für unverzichtbar bei der Behandlung von Konstruktorfehlern (das ist der Hauptgrund, warum sie schließlich zu C++ hinzugefügt wurden), aber sie erfordern auch die korrekte Verwendung anderer fortgeschrittener Techniken (YMMV) wie RAII oder intelligente Zeiger, um Ressourcenlecks zu vermeiden.

7voto

Ich programmiere seit etwa 5 Jahren immer mal wieder in C++. warum habe ich noch nie gesehen, dass Ausnahmen verwendet werden, außer als Beispiele um der Beispiele willen?

Ich bin sehr neugierig auf dieses Thema. Ich bin seit 1996 sehr neugierig auf dieses Thema. Irgendwann, ich glaube 1996, hat die C++-Ausnahmebehandlung die Art und Weise, wie ich Software schreibe, revolutioniert. Ich erinnere mich, dass ich über die C++-Ausnahmebehandlung las und sofort die Auswirkungen verstand. Innerhalb von Minuten testete ich, was passiert, wenn eine Ausnahme von einem Konstruktor ausgelöst wird. Compiler für UNIX waren bis G++ 3.0 (wann war das?) nicht bereit für C++ Exception Handling. Destruktoren wurden für nicht konstruierte Speicherstellen (auf dem Stack) aufgerufen (falls eine Ausnahme ausgelöst wurde). Destruktoren wurden nicht für erfolgreich konstruierte Objekte (auf dem Stack) aufgerufen (falls eine Exception geworfen wurde). delete wurde nicht aufgerufen, wenn ein mit new erzeugtes Objekt eine Ausnahme vom Konstruktor auslöste. Compiler für Windows und OS/2 waren 1996/1997 fertig. Sie funktionierten. Ich erinnere mich an Borland C++ für OS/2 und IBM CSet2 und Windows Visual C++.

Schließlich gab es eine Methode zum Abbruch der Konstruktion eines Objekts. Schließlich konnte man ein Objekt innerhalb eines Konstruktors zuweisen UND sich auf die erfolgreiche Konstruktion dieses Objekts in einem anderen Konstruktor verlassen. Irgendwie habe ich all diese Regeln herausgefunden. Nicht aus Büchern! Jahre später kamen Bücher heraus, in denen behauptet wurde, dass C++ Exception Handling ein guter Weg sei, um Array-out-of-bounds-Fehler oder andere Probleme abzufangen, für die ich nie aufgehört habe, assert zu benutzen. Endlich gab es eine einfache Methode, den Aufrufer mit komplexen Informationen über einen Fehler zu versorgen, ohne sich auf stderr zu verlassen. Endlich brauchte man nicht mehr ein komplexes Stück Software zu debuggen, um herauszufinden, was fehlgeschlagen war.

Ich kann Leute nicht ernst nehmen, die keine C++-Ausnahmebehandlung verwenden. Es ist unmöglich, jeden fehlerhaften Aufruf zu überprüfen. Es ist unmöglich, das gleiche Qualitätsniveau von Software zu erreichen, ohne C++ Exception Handling zu verwenden. Warum werden solche Leute immer noch eingestellt? Warum gibt es immer noch Plattformen, die keine C++-Ausnahmebehandlung bieten? Ich würde niemals in Betracht ziehen, Software für eine solche Plattform zu schreiben, genauso wie ich es ablehnen würde, eine komplexe Anwendung in Assembler-Code zu schreiben.

6voto

James Kanze Punkte 146902

Neugierig. Ich arbeite regelmäßig mit C++, und es ist mindestens zehn Jahre her, dass ich einen C++-Code gesehen habe, der keine Ausnahmen verwendet. Immer wenn man einen Fehler über eine beträchtliche Anzahl von Stackframes weitergeben muss von Stack-Frames propagieren muss, verwendet man eine Ausnahme.

5voto

Marcelo Cantos Punkte 173498

Hierfür gibt es mehrere Gründe:

  1. 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 Aufrufstapel abgefangen werden (sogar so weit oben wie main() ).
  2. Sie sollen signalisieren außergewöhnlich (d.h. seltene und unerwartete) Fehler. 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.
  3. Ausnahmen sind sehr teuer, was die Einhaltung der Entwurfsabsicht fördert.
  4. C++-Bibliotheken, die Ausnahmen auslösen, lassen sich nicht ohne weiteres mit C-Programmen verbinden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X