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.