Ich programmiere seit ca. 5 Jahren in C ++, warum habe ich nie Ausnahmen gesehen, die nur Beispiele für Beispiele sind?
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.
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.
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.
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.
Mehrere Gründe kommen in den Sinn:
main()
). 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.
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.
Ausnahmen sind zu fortgeschritten für Anfänger, daher werden diese nicht immer in den Beispielen gezeigt, besonders in Büchern.
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.
Mehrere Gründe kommen in den Sinn:
- 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 ()).
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.
- 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.
Dass die Iostream-Bibliothek keine Ausnahmen auslöst, macht sie irgendwie unbrauchbar. Fehler des Anrufers ausblenden! Das ist so C wie.
- Ausnahmen sind sehr teuer zu werfen, was die Einhaltung fördert zur Designabsicht.
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.
- C ++ - Bibliotheken, die Ausnahmen auslösen, können nicht leicht mit C verbunden werden Programme.
Was ist C? Ah ja - ich erinnere mich - etwas, dass ich um 1996 aufgegeben habe. Erinnern Sie sich an Turbo Pascal?