Warum werden Ausnahmen in C ++ selten verwendet?

7

Ich programmiere seit ca. 5 Jahren in C ++, warum habe ich nie Ausnahmen gesehen, die nur Beispiele für Beispiele sind?

    
Péter Török 24.03.2011, 23:13
quelle

11 Antworten

15

Beobachtung Verzerrung bei der Arbeit hier.

Ein bedeutender Teil des C ++ - Codes ist für Systemprogrammierung und eingebettete Systeme gedacht. (Schließlich ist C ++ nur eine von vielen Optionen für die Anwendungsprogrammierung, und viele der Alternativen haben raffiniertere RAD-Umgebungen, aber in Systemen funktioniert es oft mit der höchsten Programmiersprache, für die ein Compiler verfügbar ist). Und die meisten eingebetteten Systeme sowie ein Großteil der Systementwicklung haben Einschränkungen, die Ausnahmen ausschließen.

Wenn Sie aufgrund Ihres Fokus 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 bedeutet nicht, dass es keinen C ++ - Code gibt, der Ausnahmen verwendet - es gibt, und eine Menge davon. Es erscheint möglicherweise nicht in Code, der entworfen wurde, um Probleme zu lösen, die Sie interessieren.

    
Ben Voigt 24.03.2011, 23:17
quelle
10

Ausnahmen sind eine ziemlich späte Ergänzung der Sprache, daher glaube ich, dass viele C ++ - Entwickler nie gelernt haben, sie richtig zu verwenden, und sich vielleicht eher mit traditionellen (C-Stil) Fehlerbehandlungstechniken fühlen.

Ich persönlich denke, dass sie unentbehrlich bei der Handhabung von Konstruktorfehlern sind (das ist der Hauptgrund, warum sie C ++ hinzugefügt wurden), aber sie erfordern auch die korrekte Verwendung anderer fortgeschrittener Techniken (YMMV) wie RAII oder Smart Pointer zur Vermeidung von Ressourcen Lecks.

    
Péter Török 24.03.2011 23:16
quelle
7
  

Ich programmiere seit ca. 5 Jahren in C ++,   Warum habe ich Ausnahmen nie anders als Beispiele für Beispiele gesehen?

Ich bin sehr neugierig darauf. Ich bin sehr gespannt darauf seit 1996. Irgendwann im Jahr 1996 habe C ++ Exception Handling die Art und Weise revolutioniert, wie ich Software schreibe. Ich erinnere mich, dass ich über C ++ Exception-Behandlung gelesen habe und ich habe sofort die Implikationen verstanden. Innerhalb von Minuten habe ich getestet, was passiert, wenn eine Ausnahme von einem Konstruktor ausgelöst wird. Compiler für UNIX waren nicht bereit für C ++ Exception Handling bis G ++ 3.0 Ich denke (whe war das?). Destruktoren wurden für nicht konstruierte Speicherorte (auf dem Stapel) aufgerufen (falls eine Ausnahme ausgelöst wurde). Destruktoren wurden nicht nach erfolgreich konstruierten Objekten (auf dem Stapel) aufgerufen (falls eine Ausnahme ausgelöst wurde). delete wurde nicht aufgerufen, wenn ein Objekt, das mit new erstellt wurde, eine Exception aus dem Konstruktor geworfen hat. Compiler für Windows und OS / 2 waren 1996/1997 fertig. Sie arbeiteten. Ich erinnere mich an Borland C ++ für OS / 2 und IBM CSet2 und Windows Visual C ++.

Schließlich gab es eine Methode zum Abbrechen der Konstruktion eines Objekts. Schließlich könnte man ein Objekt innerhalb eines Konstruktors zuordnen und sich auf die erfolgreiche Konstruktion dieses Objekts in einem anderen Konstruktor verlassen. Irgendwie habe ich von allen Regeln erfahren. Nicht aus Büchern! Jahre später kamen Bücher heraus und behaupteten, dass die C ++ - Ausnahmebehandlung eine gute Möglichkeit sei, einen Array-Out-of-Bounds-Fehler oder andere Probleme zu beheben, für die ich nie aufgehört habe, assert zu verwenden. Schließlich gab es eine einfache Methode, um dem Aufrufer komplexe Informationen über einen Fehler zu liefern, ohne auf stderr angewiesen zu sein. Schließlich musste man keine komplexe Software debuggen, um herauszufinden, was fehlgeschlagen ist.

Ich kann Leute nicht ernst nehmen, die C ++ Exception Handling nicht benutzen. Es ist unmöglich, jeden fehlbaren Anruf zu überprüfen. Es ist unmöglich, die gleiche Qualität der Software zu erreichen, ohne C ++ Exception Handling zu verwenden. Warum werden solche Leute noch eingestellt? Warum gibt es noch Plattformen, die keine C ++ - Exception-Behandlung bieten? Ich würde nie darüber nachdenken, Software für eine solche Plattform zu schreiben, genauso würde ich es ablehnen, eine komplexe Anwendung in Assemblercode zu schreiben.

    
user678269 26.03.2011 18:50
quelle
6

Neugierig. Ich arbeite regelmäßig in C ++ und es waren mindestens zehn Jahre, seit ich irgendeinen C ++ Code gesehen habe, der keine Ausnahmen verwendet. Jedes Mal, wenn Sie einen Fehler um eine signifikante Anzahl erhöhen müssen von Stack-Frames verwenden Sie eine Ausnahme.

    
James Kanze 25.03.2011 10:48
quelle
4

Mehrere Gründe kommen in den Sinn:

  1. Ausnahmen sollten nicht sehr sichtbar sein, da sie so entworfen wurden, dass sie tief in die Tiefen einer Bibliothek geworfen werden und irgendwo weit oben im Call-Stack gefangen sind (sogar so hoch wie main() ).
  2. Sie sollen außergewöhnliche (d. h. seltene und unerwartete) Fehler signalisieren. Zum Beispiel ist ein Fehler beim Öffnen einer Datei nicht besonders außergewöhnlich. Daher gibt die Iostream-Bibliothek standardmäßig keine Ausnahme aus, wenn eine Datei nicht geöffnet werden kann.
  3. Ausnahmen sind sehr teuer zu werfen, was die Einhaltung der Entwurfsabsicht fördert.
  4. C ++ - Bibliotheken, die Ausnahmen auslösen, können nicht leicht mit C-Programmen verbunden werden.
Marcelo Cantos 24.03.2011 23:21
quelle
1

Ich könnte dasselbe sagen und es wäre nicht sehr voreingenommen, wenn ich definiere, dass dies für eine Microsoft-Welt und RAD gilt.

Ich denke, es liegt daran, dass Sie heute keine C ++ - Programme als solche verwenden, sondern eher eine Mischung aus Hochsprachen mit C ++ - Bibliotheken. Und oft haben Sie eine verwaltete-nicht-verwaltete Grenze.

Das Werfen und Einfangen von Ausnahmen durch diese Grenze ist wie das Anzünden eines Feuerwerkskörpers in deinem Arsch :) - [lies Memleck oder Schlimmeres]

Darüber hinaus müssen Sie, wenn Sie COM-Objekte verwenden, COM-Ausnahmen verwenden, so dass die Verwendung der Standard-C ++ - Ausnahme sich intern in einer oft kleinen Bibliothek befinden muss. In kleinen Bibliotheken müssen Sie keine Ausnahmen verwenden.

    
Marino Šimić 24.03.2011 23:23
quelle
1

Weil es eine große Diskrepanz zwischen "realem" Code und "Textbuch" -Code gibt.

Ich arbeite in einer "großen" Softwarefirma und kann Ihnen ehrlich sagen, dass das, was Sie in der Produktion sehen, fast 0% der guten Praktiken entspricht, von denen Sie in guten Büchern lesen.

Nehmen Sie das effektive C ++ - Buch von Scott Meyers als Beispiel. Sollte eine Kopie auf jedem Schreibtisch eines Softwareentwicklers sein, von der Ostküste nach Westen.

    
J T 24.03.2011 23:24
quelle
1

Ausnahmen sind zu fortgeschritten für Anfänger, daher werden diese nicht immer in den Beispielen gezeigt, besonders in Büchern.

    
rice-meister 19.01.2014 01:16
quelle
0

Ich spreche von Desktop-Anwendungen für Windows. In meiner Beobachtung (YMMV auch), frühere Phase der Entwicklung wahrscheinlich bis zu den ersten Veröffentlichungen. Viele Entwickler denken nicht früh an Ausnahmen. Aus diesem Grund gibt es nur wenige Codes mit Ausnahmebehandlung, aber wenn Sie bereits 2 oder 3 Releases hatten oder wenn Sie sich in der Wartungsphase befinden, werden Ausnahmen aufgrund verschiedener Fehler durch Kundenberichte berücksichtigt.

    
redwud 05.06.2013 02:46
quelle
0
  

Mehrere Gründe kommen in den Sinn:

     
  1. Ausnahmen sollten nicht sehr sichtbar sein, da sie so gestaltet sind   tief in die Eingeweide einer Bibliothek geworfen und irgendwo hoch oben gefangen   im Call-Stack (sogar so hoch wie main ()).
  2.   

Ich weiß nicht, was Sie mit "Ausnahmen sollten nicht sehr sichtbar sein". Aber ich stimme zu, dass Catch-Blöcke selten sein sollten - und sie sind normalerweise in main.

  
  1. Sie sollen außergewöhnlich signalisieren (d. h. selten und unerwartet)   Fehler. Zum Beispiel, Fehler beim Öffnen einer Datei ist nicht besonders   außergewöhnlich. Daher wirft die Iostream-Bibliothek standardmäßig keine   Ausnahme, wenn eine Datei nicht geöffnet werden kann.
  2.   

Dass die Iostream-Bibliothek keine Ausnahmen auslöst, macht sie irgendwie unbrauchbar. Fehler des Anrufers ausblenden! Das ist so C wie.

  
  1. Ausnahmen sind sehr teuer zu werfen, was die Einhaltung fördert   zur Designabsicht.
  2.   

Normalerweise Ausnahmen sind für Systemaufrufe fehlgeschlagen. Da das Schreiben in eine Datei oder das Öffnen einer Datei nicht wirklich kostengünstig ist, man würde sich nicht darum kümmern, dass Ausnahmen teuer sind. Auch die Überprüfung auf Erfolg ist teurer als die Verwendung von C ++ Exception Handling. Normalerweise würde man in einem zeitkritischen Teil des Codes keinen try-catch-Block erstellen.

  
  1. C ++ - Bibliotheken, die Ausnahmen auslösen, können nicht leicht mit C verbunden werden   Programme.
  2.   

Was ist C? Ah ja - ich erinnere mich - etwas, dass ich um 1996 aufgegeben habe. Erinnern Sie sich an Turbo Pascal?

    
user678269 26.03.2011 19:02
quelle
0

Ausnahmen werden in Beispielen nicht verwendet, weil sie selten im Mittelpunkt vieler Fragen stehen oder etwas, das Sie von Anfang an wissen möchten.

    
redwud 29.12.2013 14:53
quelle

Tags und Links