Wie kann ich Verträge für Ausnahmen erstellen und durchsetzen?

33

Ich versuche, meinen Teamleiter davon zu überzeugen, die Verwendung von Ausnahmen in C ++ zuzulassen, anstatt einen Bool isSuccessfuloder eine Aufzählung mit dem Fehlercode zurückzugeben. Dieser Kritik an ihm kann ich jedoch nicht entgegentreten.

Betrachten Sie diese Bibliothek:

class OpenFileException() : public std::runtime_error {
}

void B();
void C();

/** Does blah and blah. */
void B() {
    // The developer of B() either forgot to handle C()'s exception or
    // chooses not to handle it and let it go up the stack.
    C();
};

/** Does blah blah.
 *
 * @raise OpenFileException When we failed to open the file. */
void C() {
    throw new OpenFileException();
};
  1. Betrachten Sie einen Entwickler, der die B()Funktion aufruft . Er prüft die Dokumentation und stellt fest, dass es keine Ausnahmen gibt, also versucht er nicht, etwas zu fangen. Dieser Code könnte das Programm in der Produktion zum Absturz bringen.

  2. Betrachten Sie einen Entwickler, der die C()Funktion aufruft . Er prüft die Dokumentation nicht und erfasst keine Ausnahmen. Der Aufruf ist unsicher und kann das Programm in der Produktion zum Absturz bringen.

Aber wenn wir auf diese Weise nach Fehlern suchen:

void old_C(myenum &return_code);

Ein Entwickler, der diese Funktion verwendet, wird vom Compiler gewarnt, wenn er dieses Argument nicht angibt, und er würde sagen "Aha, dies gibt einen Fehlercode zurück, auf den ich prüfen muss."

Wie kann ich Ausnahmen sicher verwenden, damit es eine Art Vertrag gibt?

DBedrenko
quelle
4
@Sjoerd Der Hauptvorteil besteht darin, dass ein Entwickler vom Compiler gezwungen wird, der Funktion zum Speichern des Rückkehrcodes eine Variable bereitzustellen. er wird darauf aufmerksam gemacht, dass es einen Fehler geben kann und er sollte damit umgehen. Das ist unendlich besser als Ausnahmen, die überhaupt keine Überprüfung der Kompilierzeit haben.
DBedrenko
4
"er sollte damit umgehen" - es wird auch nicht geprüft, ob dies passiert.
Sjoerd
4
@ Joerd Es ist nicht notwendig. Es ist gut genug, um den Entwickler darauf aufmerksam zu machen, dass ein Fehler auftreten kann und dass er danach suchen sollte. Auch für die Reviewer ist klar, ob sie auf Fehler geprüft haben oder nicht.
DBedrenko
5
Möglicherweise haben Sie eine bessere Chance, mit einem Either/ Resultmonad den Fehler in einer typsicheren kompositorischen Weise zurückzugeben
Daenyth
5
@gardenhead Da zu viele Entwickler es nicht richtig einsetzen, kommt es zu hässlichem Code und sie machen die Funktion für sich selbst verantwortlich. Die aktivierte Ausnahmefunktion in Java ist eine schöne Sache, aber sie wird schlecht aufgenommen, weil manche Leute sie einfach nicht verstehen.
AxiomaticNexus

Antworten:

47

Dies ist eine berechtigte Kritik an Ausnahmen. Sie sind oft weniger sichtbar als eine einfache Fehlerbehandlung wie die Rückgabe eines Codes. Und es gibt keine einfache Möglichkeit, einen "Vertrag" durchzusetzen. Ein Teil des Punktes besteht darin, Ihnen zu ermöglichen, dass Ausnahmen auf einer höheren Ebene abgefangen werden (wenn Sie jede Ausnahme auf jeder Ebene abfangen müssen, wie unterscheidet es sich überhaupt von der Rückgabe eines Fehlercodes?). Dies bedeutet, dass Ihr Code von einem anderen Code aufgerufen werden kann, der ihn nicht ordnungsgemäß verarbeitet.

Ausnahmen haben Nachteile; Sie müssen einen Fall basierend auf Kosten-Nutzen machen.
Ich fand diese beiden Artikel hilfreich: Die Notwendigkeit von Ausnahmen und Alles falsch mit Ausnahmen. Außerdem bietet dieser Blog-Beitrag Meinungen vieler Experten zu Ausnahmen, mit einem Schwerpunkt auf C ++ . Während die Meinung von Experten eher für Ausnahmen zu sprechen scheint, ist dies alles andere als ein klarer Konsens.

Es könnte sein , dass dies nicht der richtige Kampf ist, um Ihren Teamleiter zu überzeugen . Besonders nicht mit altem Code. Wie im zweiten Link oben erwähnt:

Ausnahmen können nicht durch Code weitergegeben werden, der nicht ausnahmesicher ist. Die Verwendung von Ausnahmen impliziert daher, dass der gesamte Code im Projekt ausnahmesicher sein muss.

Das Hinzufügen von ein wenig Code, der Ausnahmen für ein Projekt verwendet, das dies hauptsächlich nicht tut, ist wahrscheinlich keine Verbesserung. Das Nichtverwenden von Ausnahmen in ansonsten gut geschriebenem Code ist weit von einem katastrophalen Problem entfernt. Je nach Anwendung und dem Experten, den Sie fragen, ist dies möglicherweise überhaupt kein Problem. Sie müssen Ihre Schlachten auswählen.

Dies ist wahrscheinlich kein Argument, mit dem ich mich befassen würde - zumindest nicht, bis ein neues Projekt gestartet wird. Und selbst wenn Sie ein neues Projekt haben, wird es von einem älteren Code verwendet oder verwendet?


quelle
1
Danke für den Rat und die Links. Dies ist ein neues Projekt, kein altes. Ich frage mich, warum Ausnahmen so weit verbreitet sind, wenn sie einen so großen Nachteil haben, dass ihre Verwendung unsicher wird. Wenn Sie eine Ausnahme abfangen, die n-Stufen höher ist, und den Code später ändern und verschieben, gibt es keine statische Überprüfung, um sicherzustellen, dass die Ausnahme immer noch abgefangen und behandelt wird (und es ist zu viel, Prüfer zu bitten, alle Funktionen auf n-Stufen zu überprüfen ).
DBedrenko
3
@Dee Unter den obigen Links finden Sie einige Argumente für Ausnahmen (ich habe einen zusätzlichen Link mit mehr Expertenmeinung hinzugefügt).
6
Diese Antwort ist genau richtig!
Doc Brown
1
Ich kann aus Erfahrung sagen, dass der Versuch, einer vorhandenen Codebasis Ausnahmen hinzuzufügen, eine WIRKLICH schlechte Idee ist. Ich habe mit einer solchen Codebasis gearbeitet, und es war WIRKLICH, WIRKLICH schwer, damit zu arbeiten, weil Sie nie wussten, was in Ihrem Gesicht explodieren würde. Ausnahmen sollten NUR in Projekten verwendet werden, in denen Sie sie im Voraus planen.
Michael Kohne
26

Es gibt buchstäblich ganze Bücher zu diesem Thema, daher ist jede Antwort bestenfalls eine Zusammenfassung. Hier sind einige der wichtigen Punkte, die ich aufgrund Ihrer Frage für angebracht halte. Es ist keine vollständige Liste.


Ausnahmen sollen NICHT überall aufgefangen werden.

Solange sich in der Hauptschleife ein allgemeiner Ausnahmebehandler befindet (abhängig von der Art der Anwendung (Webserver, lokaler Dienst, Befehlszeilendienstprogramm ...)), verfügen Sie normalerweise über alle erforderlichen Ausnahmebehandler.

In meinem Code gibt es - wenn überhaupt - nur wenige catch-Anweisungen außerhalb der Hauptschleife. Und das scheint der gängige Ansatz in modernem C ++ zu sein.


Ausnahmen und Rückkehrcodes schließen sich nicht gegenseitig aus.

Sie sollten dies nicht zu einem Alles-oder-Nichts-Ansatz machen. Ausnahmen sollten für Ausnahmesituationen verwendet werden. Dinge wie "Konfigurationsdatei nicht gefunden", "Datenträger voll" oder alles andere, was lokal nicht gehandhabt werden kann.

Häufige Fehler wie die Überprüfung, ob ein vom Benutzer angegebener Dateiname gültig ist, sind kein Anwendungsfall für Ausnahmen. Verwenden Sie in diesen Fällen stattdessen einen Rückgabewert.

Wie Sie aus den obigen Beispielen ersehen können, kann "Datei nicht gefunden" je nach Anwendungsfall entweder eine Ausnahme oder ein Rückkehrcode sein: "ist Teil der Installation" versus "Benutzer kann Tippfehler machen."

Es gibt also keine absolute Regel. Eine grobe Richtlinie ist: Wenn es lokal gehandhabt werden kann, machen Sie es zu einem Rückgabewert; Wenn Sie nicht lokal damit umgehen können, lösen Sie eine Ausnahme aus.


Die statische Überprüfung von Ausnahmen ist nicht sinnvoll.

Da Ausnahmen ohnehin nicht lokal behandelt werden sollen, ist es normalerweise nicht wichtig, welche Ausnahmen geworfen werden können. Die einzige nützliche Information ist, ob eine Ausnahme ausgelöst werden kann.

Java hat eine statische Prüfung, wird jedoch normalerweise als fehlgeschlagen angesehen, und die meisten Sprachen, insbesondere C #, haben diese Art der statischen Prüfung nicht. Dies ist eine gute Lektüre über die Gründe, warum C # es nicht hat.

Aus diesen Gründen hat C ++ es throw(exceptionA, exceptionB)zugunsten von abgelehnt noexcept(true). Die Standardeinstellung ist, dass eine Funktion ausgelöst werden kann, daher sollten Programmierer dies erwarten, sofern die Dokumentation nicht ausdrücklich etwas anderes verspricht.


Das Schreiben von Exception-Safe-Code hat nichts mit dem Schreiben von Exception-Handlern zu tun.

Ich würde eher sagen, dass es beim Schreiben von ausnahmesicherem Code darum geht, das Schreiben von Ausnahmehandlern zu vermeiden!

Die meisten Best Practices zielen darauf ab, die Anzahl der Ausnahmebehandler zu reduzieren. Das einmalige Schreiben und automatische Aufrufen von Code - z. B. über RAII - führt zu weniger Fehlern als das Kopieren und Einfügen desselben Codes überall.

Sjoerd
quelle
3
" Solange es einen allgemeinen Ausnahmebehandler gibt ... sind Sie normalerweise schon in Ordnung. " Dies widerspricht den meisten Quellen, die betonen, dass es sehr schwierig ist, ausnahmesicheren Code zu schreiben.
12
@ dan1111 "Exception Safe Code schreiben" hat wenig mit dem Schreiben von Exception Handlern zu tun. Beim Schreiben von ausnahmesicherem Code geht es um die Verwendung von RAII zum Einkapseln von Ressourcen, die Verwendung von "Alle Arbeiten zuerst lokal ausführen und dann Swap / Move verwenden" und anderen bewährten Methoden. Diese sind eine Herausforderung, wenn Sie nicht an sie gewöhnt sind. Das Schreiben von Ausnahmebehandlungsroutinen gehört jedoch nicht zu diesen bewährten Methoden.
Sjoerd
4
@AxiomaticNexus Auf einer bestimmten Ebene können Sie jede erfolglose Verwendung einer Funktion als "schlechte Entwickler" erklären. Die besten Ideen sind diejenigen, die den schlechten Gebrauch reduzieren, weil sie es einfach machen, das Richtige zu tun. Statisch überprüfte Ausnahmen fallen nicht in diese Kategorie. Sie schaffen Arbeit, die in keinem Verhältnis zu ihrem Wert steht, oft an Orten, an denen sich der zu schreibende Code nicht einmal darum kümmern muss. Benutzer sind versucht, sie auf falsche Weise zum Schweigen zu bringen, damit der Compiler sie nicht mehr stört. Sogar richtig gemacht, führen sie zu viel Unordnung.
jpmc26
4
@AxiomaticNexus Der Grund dafür, dass dies unverhältnismäßig ist, ist, dass es sich leicht auf nahezu jede Funktion in Ihrer gesamten Codebasis übertragen lässt . Wenn alle Funktionen in der Hälfte meiner Klassen auf die Datenbank zugreifen, muss nicht jeder explizit deklarieren, dass er eine SQLException auslösen kann. Auch nicht jede Controller-Methode, die sie aufruft. So viel Lärm ist eigentlich ein negativer Wert, egal wie gering der Arbeitsaufwand ist. Sjoerd trifft den Nagel auf den Kopf: Der Großteil Ihres Codes muss sich nicht mit Ausnahmen befassen, da er sowieso nichts dagegen unternehmen kann .
jpmc26
3
@AxiomaticNexus Ja, weil die besten Entwickler so perfekt sind, wird ihr Code immer perfekt mit jeder möglichen Benutzereingabe umgehen, und Sie werden diese Ausnahmen niemals jemals in prod sehen. Und wenn Sie dies tun, bedeutet dies, dass Sie ein Versager im Leben sind. Im Ernst, gib mir diesen Müll nicht. Niemand ist so perfekt, nicht einmal der Beste. Und Ihre App sollte sich auch angesichts dieser Fehler vernünftig verhalten, selbst wenn "vernünftig" "Stopp und Rückgabe einer halbwegs vernünftigen Fehlerseite / -nachricht" lautet. Und raten SieIOException mal , dasselbe machen Sie auch mit 99% von s . Die überprüfte Unterteilung ist willkürlich und unbrauchbar.
jpmc26
8

C ++ - Programmierer suchen nicht nach Ausnahmespezifikationen. Sie suchen Ausnahmegarantien.

Angenommen, ein Teil des Codes hat eine Ausnahme ausgelöst. Welche Annahmen kann der Programmierer treffen, die noch gültig sind? Was garantiert der Code in Bezug auf die Art und Weise, in der der Code geschrieben wurde, nach einer Ausnahme?

Oder ist es möglich, dass ein bestimmtes Stück Code garantieren kann, dass es niemals geworfen wird (dh nichts anderes als das Beenden des Betriebssystemprozesses)?

Das Wort "Rollback" kommt häufig in Diskussionen über Ausnahmen vor. Ein Beispiel für eine Ausnahmegarantie ist die Möglichkeit, ein Rollback in einen gültigen Status durchzuführen (der explizit dokumentiert ist). Wenn keine Ausnahmegarantie besteht, sollte ein Programm sofort beendet werden, da nicht einmal garantiert wird, dass der Code, den es danach ausführt, wie beabsichtigt funktioniert. Wenn beispielsweise der Speicher beschädigt ist, ist jede weitere Operation ein technisch undefiniertes Verhalten.

Verschiedene C ++ - Programmiertechniken fördern Ausnahmegarantien. RAII (Scope-based Resource Management) bietet einen Mechanismus, mit dem Bereinigungscode ausgeführt und sichergestellt werden kann, dass Ressourcen sowohl in normalen als auch in Ausnahmefällen freigegeben werden. Wenn Sie eine Kopie der Daten erstellen, bevor Sie Änderungen an Objekten vornehmen, können Sie den Status des Objekts wiederherstellen, wenn der Vorgang fehlschlägt. Und so weiter.

Die Antworten auf diese StackOverflow-Frage geben einen Einblick in die langen Wege, die C ++ - Programmierer gehen, um alle möglichen Fehlermodi zu verstehen, die mit ihrem Code einhergehen könnten, und um zu versuchen, die Gültigkeit des Programmstatus trotz Fehlern zu gewährleisten. Die zeilenweise Analyse von C ++ - Code wird zur Gewohnheit.

Bei der Entwicklung in C ++ (für die Produktion) kann man es sich nicht leisten, die Details zu beschönigen. Binär-Blob (Nicht-Open-Source) ist der Fluch von C ++ - Programmierern. Wenn ich ein binäres Blob aufrufen muss und das Blob fehlschlägt, ist Reverse Engineering das, was ein C ++ - Programmierer als Nächstes tun würde.

Referenz: http://en.cppreference.com/w/cpp/language/exceptions#Exception_safety - siehe unter Exception Safety.

C ++ hatte einen fehlgeschlagenen Versuch, Ausnahmespezifikationen zu implementieren. Eine spätere Analyse in anderen Sprachen besagt, dass Ausnahmespezifikationen einfach nicht praktikabel sind.

Warum es ein fehlgeschlagener Versuch ist: Um ihn strikt durchzusetzen, muss er Teil des Typsystems sein. Ist es aber nicht. Der Compiler prüft nicht auf Ausnahmespezifikationen.

Warum C ++ dies gewählt hat und warum Erfahrungen mit anderen Sprachen (Java) beweisen, dass die Ausnahmespezifikation umstritten ist: Wenn Sie die Implementierung einer Funktion ändern (zum Beispiel müssen Sie eine andere Funktion aufrufen, die möglicherweise eine neue Art von auslöst Ausnahme) bedeutet eine strikte Durchsetzung der Ausnahmespezifikation, dass Sie diese Spezifikation ebenfalls aktualisieren müssen. Dies setzt sich fort - möglicherweise müssen Sie die Ausnahmespezifikationen für Dutzende oder Hunderte von Funktionen aktualisieren, um eine einfache Änderung zu erzielen. Bei abstrakten Basisklassen (dem C ++ - Äquivalent von Interfaces) wird es schlimmer. Wenn die Ausnahmespezifikation für Schnittstellen erzwungen wird, dürfen Implementierungen von Schnittstellen keine Funktionen aufrufen, die verschiedene Arten von Ausnahmen auslösen.

Referenz: http://www.gotw.ca/publications/mill22.htm

Ab C ++ 17 kann das [[nodiscard]]Attribut für Funktionsrückgabewerte verwendet werden (siehe: https://stackoverflow.com/questions/39327028/can-ac-function-be-declared-that-the-return-value) -kann-nicht-ignoriert werden ).

Wenn ich also eine Codeänderung vornehme und dies eine neue Art von Fehlerbedingung einführt (dh eine neue Art von Ausnahme), handelt es sich dann um eine brechende Änderung? Sollte es den Anrufer gezwungen haben, den Code zu aktualisieren, oder zumindest über die Änderung gewarnt werden?

Wenn Sie die Argumente akzeptieren, mit denen C ++ - Programmierer nach Ausnahmegarantien anstelle von Ausnahmespezifikationen suchen, lautet die Antwort: Wenn die neue Art der Fehlerbedingung keine der Ausnahmebedingungen aufhebt, die den zuvor versprochenen Code garantieren, handelt es sich nicht um eine brechende Änderung.

rwong
quelle
"Wenn Sie die Implementierung einer Funktion ändern (zum Beispiel eine andere Funktion aufrufen müssen, die möglicherweise eine neue Art von Ausnahme auslöst), bedeutet eine strikte Durchsetzung der Ausnahmespezifikation, dass Sie diese Spezifikation ebenfalls aktualisieren müssen." - Gut , wie du solltest. Was wäre die Alternative? Ignorieren Sie die neu eingeführte Ausnahme?
AxiomaticNexus
@AxiomaticNexus Das wird auch durch Ausnahmegarantie beantwortet. Ich behaupte sogar, dass die Spezifikation niemals vollständig sein kann. Garantie ist das, wonach wir suchen. Oft vergleichen wir den Ausnahmetyp, um herauszufinden, welche Garantie verletzt wurde - um zu erraten, welche Garantie noch gültig ist. Die Ausnahmespezifikation listet einige der Typen auf, die Sie überprüfen müssen. Beachten Sie jedoch, dass die Liste in einem praktischen System möglicherweise nicht vollständig sein kann. Die meiste Zeit, zwingt es die Menschen auf die Verknüpfung von „Essen“ der Ausnahmetypen zu nehmen, sie in einer anderen Ausnahme Einwickeln, die Ausnahmetyp Überprüfung schwer macht
rwong
@AxiomaticNexus Ich argumentiere weder für noch gegen die Verwendung von Ausnahmen. Bei der Verwendung typischer Ausnahmen wird empfohlen, eine Basisausnahmeklasse und einige abgeleitete Ausnahmeklassen zu haben. In der Zwischenzeit muss man bedenken, dass andere Ausnahmetypen möglich sind, zB solche, die aus C ++ STL oder anderen Bibliotheken geworfen werden. Es könnte argumentiert werden, dass die Ausnahmespezifikation in diesem Fall funktionieren könnte: Geben Sie an, dass die Standardausnahmen ( std::exception) und Ihre eigene Basisausnahme ausgelöst werden. Auf ein ganzes Projekt angewendet bedeutet dies jedoch, dass jede einzelne Funktion dieselbe Spezifikation hat: Rauschen.
Rwong
Ich möchte darauf hinweisen, dass C ++ und Java / C # in Bezug auf Ausnahmen unterschiedliche Sprachen sind. Erstens ist C ++ nicht typsicher, da es die Ausführung von willkürlichem Code oder das Überschreiben von Daten zulässt, und zweitens gibt C ++ keinen netten Stack-Trace aus. Diese Unterschiede zwangen C ++ - Programmierer, hinsichtlich der Fehler- und Ausnahmebehandlung unterschiedliche Entscheidungen zu treffen. Dies bedeutet auch, dass bestimmte Projekte berechtigterweise behaupten könnten, C ++ sei keine geeignete Sprache für sie. (Ich persönlich bin zum Beispiel der Meinung, dass die TIFF-
Bilddecodierung
1
@rwong: Ein großes Problem bei der Ausnahmebehandlung in Sprachen, die dem C ++ - Modell folgen, besteht darin, dass catchder Typ des Ausnahmeobjekts zugrunde liegt, wenn in vielen Fällen nicht so sehr die direkte Ursache der Ausnahme von Bedeutung ist, sondern vielmehr, worum es geht der Systemzustand. Leider sagt der Typ einer Ausnahme im Allgemeinen nichts darüber aus, ob Code dazu geführt hat, dass ein Teil des Codes auf eine Weise unterbrochen wurde, die ein Objekt in einem teilweise aktualisierten (und damit ungültigen) Zustand zurückließ.
Supercat
4

Stellen Sie sich einen Entwickler vor, der die C () - Funktion aufruft. Er prüft die Dokumentation nicht und erfasst keine Ausnahmen. Der Anruf ist unsicher

Es ist absolut sicher. Er muss nicht an jedem Ort Ausnahmen fangen, er kann einfach einen Versuch / Fang an einen Ort werfen, an dem er tatsächlich etwas Nützliches dagegen unternehmen kann. Es ist nur unsicher, wenn er zulässt, dass es aus einem Thread austritt, aber es ist normalerweise nicht schwer, dies zu verhindern.

DeadMG
quelle
Dies ist unsicher, da er keine Ausnahme erwartet C()und folglich nicht vor dem Code schützt, der nach dem Überspringen des Aufrufs auftritt. Wenn dieser Code erforderlich ist, um zu gewährleisten, dass eine gewisse Invarianz wahr bleibt, ist diese Garantie bei der ersten Ausnahme, die eintritt, hinfällig C(). Es gibt keine absolut ausnahmesichere Software, und mit Sicherheit nicht dort, wo niemals Ausnahmen erwartet wurden.
cmaster
1
@cmaster Dass er keine Ausnahme erwartet,C() ist ein großer Fehler. Die Standardeinstellung in C ++ ist, dass jede Funktion ausgelöst werden kann - es ist ein expliziter noexcept(true)Befehl erforderlich , um den Compiler anders zu informieren. In Abwesenheit dieses Versprechens muss ein Programmierer annehmen, dass eine Funktion werfen kann.
Sjoerd
1
@cmaster Das ist seine eigene blöde Schuld und hat nichts mit dem Autor von C () zu tun. Ausnahmesicherheit ist eine Sache, die er lernen und befolgen sollte. Wenn er eine Funktion aufruft, von der er nicht weiß, dass sie nichts anderes ist, sollte er verdammt gut damit umgehen, was passiert, wenn sie ausgelöst wird. Wenn er keine Ausnahme braucht, sollte er eine Implementierung finden, die ist.
DeadMG
@Sjoerd und DeadMG: Während der Standard zulässt, dass eine Funktion eine Ausnahme auslöst, bedeutet dies nicht, dass Projekte Ausnahmen in ihrem Code zulassen müssen. Wenn Sie Ausnahmen von Ihrem Code verbieten, so wie es der Teamleiter des OP zu tun scheint, müssen Sie keine ausnahmesichere Programmierung vornehmen. Und wenn Sie versuchen, einen Teamleiter davon zu überzeugen, Ausnahmen in einer Codebasis zuzulassen, die zuvor ausnahmefrei war, gibt es eine Menge C()Funktionen, die bei Vorhandensein von Ausnahmen nicht funktionieren. Dies ist wirklich eine sehr unkluge Sache, es ist zum Scheitern verurteilt, zu einer Tonne von Problemen zu führen.
cmaster
@cmaster Hier geht es um ein neues Projekt - siehe den ersten Kommentar zur akzeptierten Antwort. Es gibt also keine existierenden Funktionen, die kaputt gehen, da es keine existierenden Funktionen gibt.
Sjoerd
3

Wenn Sie ein kritisches System erstellen, sollten Sie die Anweisungen Ihres Teamleiters befolgen und keine Ausnahmen verwenden. Dies ist die AV-Regel 208 in den C ++ - Codierungsstandards von Lockheed Martin für Joint Strike Fighter-Luftfahrzeuge . Auf der anderen Seite haben MISRA C ++ - Richtlinien sehr spezifische Regeln, wann Ausnahmen verwendet werden können und wann nicht, wenn Sie ein MISRA-kompatibles Softwaresystem erstellen.

Wenn Sie kritische Systeme erstellen, können Sie auch statische Analysetools ausführen. Viele statische Analysewerkzeuge warnen, wenn Sie den Rückgabewert einer Methode nicht überprüfen, wodurch Fälle fehlender Fehlerbehandlung sofort sichtbar werden. Nach meinem besten Wissen ist eine ähnliche Toolunterstützung zum Erkennen einer ordnungsgemäßen Ausnahmebehandlung nicht so stark.

Letztendlich würde ich argumentieren, dass vertragliches Design und defensive Programmierung in Verbindung mit statischer Analyse für kritische Softwaresysteme sicherer sind als Ausnahmen.

Thomas Owens
quelle