Ich weiß nicht, ob es eine Theorie gibt oder nicht, aber es kann eine aufkommende pragmatische experimentelle Wissenschaft geben.
Die beste Quelle, an die ich denken kann, ist Bjarne Stroustrup, Das Design und die Entwicklung von C ++, Addison-Wesley, 1994 . Wenn ich mich richtig erinnere (es ist ein sehr gutes Buch und die Leute leihen es mir aus und geben es nicht zurück, so dass ich im Moment keine Kopie habe), gibt es ein Kapitel über Ausnahmen. Das C ++ - Komitee unter Stroustrup benötigte viele empirische Beweise dafür, dass ein vorgeschlagenes Feature notwendig war, bevor es zur Sprachdefinition hinzugefügt werden konnte. Die Wikipedia-Seite über Ausnahmen enthält das folgende Zitat aus diesem Buch:
Auf dem Palo Alto [C ++ - Standardisierung] -Treffen im November 1991 hörten wir eine brillante Zusammenfassung der Argumente für die Terminierungssemantik, die sowohl auf persönlichen Erfahrungen als auch auf Daten von Jim Mitchell (von Sun, ehemals Xerox PARC) beruhte. Jim hatte über einen Zeitraum von 20 Jahren die Ausnahmebehandlung in einem halben Dutzend Sprachen verwendet und war als einer der Hauptentwickler und Implementierer des Cedar / Mesa-Systems von Xerox ein Befürworter der Wiederaufnahmesemantik. Seine Botschaft war, dass die Kündigung der Wiederaufnahme vorgezogen wird. Dies ist keine Ansichtssache, sondern eine Frage jahrelanger Erfahrung. Die Wiederaufnahme ist verführerisch, aber nicht gültig. Er untermauerte diese Aussage mit Erfahrungen aus mehreren Betriebssystemen. Das Schlüsselbeispiel war Cedar / Mesa: Es wurde von Leuten geschrieben, die die Wiederaufnahme mochten und benutzten, aber nach zehn Jahren des Gebrauchs, es gab nur noch eine Verwendung der Wiederaufnahme im halben-Millionen-Linien-System - und das war eine Kontextuntersuchung. Da eine Wiederaufnahme für eine solche Kontextabfrage eigentlich nicht erforderlich war, wurde sie entfernt und in diesem Teil des Systems eine signifikante Geschwindigkeitssteigerung festgestellt. In jedem Fall, in dem eine Wiederaufnahme verwendet worden war, war sie über die zehn Jahre zu einem Problem geworden, und ein geeigneteres Design hatte sie ersetzt. Grundsätzlich war jede Verwendung der Wiederaufnahme ein Versagen, getrennte Abstraktionsebenen disjunkt zu halten. In jedem Fall, in dem eine Wiederaufnahme verwendet worden war, war sie über die zehn Jahre zu einem Problem geworden, und ein geeigneteres Design hatte sie ersetzt. Grundsätzlich war jede Verwendung der Wiederaufnahme ein Misserfolg, getrennte Abstraktionsebenen disjunkt zu halten. In jedem Fall, in dem eine Wiederaufnahme verwendet worden war, war sie über die zehn Jahre zu einem Problem geworden, und ein geeigneteres Design hatte sie ersetzt. Grundsätzlich war jede Verwendung der Wiederaufnahme ein Misserfolg, getrennte Abstraktionsebenen disjunkt zu halten.
In C ++ ist RAII der eigentliche Gewinn , wodurch die Freigabe von Ressourcen bei Fehlern erheblich vereinfacht wird. (Es beseitigt nicht die Notwendigkeit für throw
und try
- catch
, aber es bedeutet, dass Sie nicht brauchen finally
.)
Ich denke, die Sache, die sie davon überzeugt hat, dass sie Ausnahmen brauchten, sind generische Container: Der Container-Schreiber weiß nichts über die Arten von Fehlern, die die enthaltenen Objekte zurückgeben müssen (und erst recht nicht, wie sie behandelt werden), sondern über den Code, der diese Objekte in den Container eingefügt hat Der Container muss etwas über die Schnittstelle dieser Objekte wissen. Da wir jedoch nicht wissen, welche Arten von Fehlern die enthaltenen Objekte auslösen können, können wir keine Standardisierung für Ausnahmetypen vornehmen. (Umgekehrt: Wenn wir Ausnahmetypen standardisieren könnten, bräuchten wir keine Ausnahmen.)
Das andere, was die Leute anscheinend über die Jahre gelernt haben, ist, dass es schwierig ist, Ausnahmespezifikationen korrekt in eine Sprache zu setzen. Siehe zum Beispiel diese: http://www.gotw.ca/publications/mill22.htm , oder diese: http://www.gotw.ca/gotw/082.htm . (Und es ist nicht nur C ++, Java-Programmierer haben auch lange Auseinandersetzungen über ihre Erfahrungen mit geprüften und nicht geprüften Ausnahmen .)
Ein wenig über die Geschichte der Ausnahmen. Der klassische Artikel lautet: John B. Goodenough: "Ausnahmebehandlung: Probleme und eine vorgeschlagene Notation", Commun. ACM 18 (12): 683-696, 1975. Vorher waren jedoch Ausnahmen bekannt. Mesa hatte sie ungefähr 1974, und PL / I könnte sie auch gehabt haben. Ada hatte vor 1980 einen Ausnahmemechanismus. Ich glaube, dass die Ausnahmen von C ++ am meisten von der Erfahrung mit Barbara Liskovs CLU-Programmiersprache ab 1976 beeinflusst wurden. Barbara Liskov: "Eine Geschichte der CLU" in Geschichte der Programmiersprachen --- II , Thomas J. Bergin Jr. und Richard G. Gibson Jr. (Hrsg.). S. 471–510, ACM, 1996 .