Exceptions Considered Useful
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Veränderung (letzte Änderung) (keine anderen Diffs, Normalansicht)

Verändert: 53c53
ISBN 0-13-235088-2 Robert C. Martin: Clean Code, A Handbook of Agile Software Craftsmanship:
ISBN 0-13-235088-2 Robert C. Martin: Clean Code, A Handbook of Agile Software Craftsmanship (s.a. CleanCodeDeveloper):

Exceptions Considered Useful

eine Replik auf ExceptionsConsideredHarmful.

Exceptions haben Struktur

Neue Werkzeuge erlauben neue Denkweisen, manchmal erfordern sie sie auch. Exceptions sind erstmal nicht mit Goto vergleichbar: eine Exception leitet den Kontrollfluß nicht beliebig um, sondern immer aus dem aktuellen Block heraus direkt hinter dessen Ende, wo sie gefangen wird oder wieder den Block verläßt. Sie kodifizieren lediglich das Idiom (und nur dieses Idiom), eine Rechnung frühzeitig abzubrechen, wenn ein singulärer Zustand vorgefunden wird. Wer das nicht glaubt, möge mal versuchen, eine Schleife mit Exceptions zu implementieren (mit Goto wäre es trivial).

Als Programmierer muss man also nicht auf wilde Sprünge gefaßt sein, sondern nur darauf, dass Codeblöcke vorzeitig verlassen werden. Wie wird man damit fertig, ohne unzählige implizite Codepfade zu verfolgen? Indem man sich an eine einfache Invariante hält, nämlich atomare Aktionen:

Jeder Codeblock läuft entweder bis zu seinem Ende durch oder hat keinen (programmatisch feststellbaren) Effekt.

Das ist in der Regel viel einfacher, als es auf den ersten Blick aussieht. Solange nur auf lokalen Variablen gearbeitet wird, gibt es keinen Effekt. Muss globaler Zustand verändert werden, so macht man das mit Copy-And-Swap, das ist von allein exceptionsicher. Geht auch das nicht, implementiert man Commit/Rollback-Semantik. Natürlich klappt nicht immer alles so sauber, aber die Fälle, die Schwierigkeiten bereiten, tun das auch bei Benutzung anderer Mechanismen.

Spezialfall im übrigen: mal angenommen, es gibt überhaupt keinen eindeutigen Kontrollfluß. Sagen wir, ein komplizierter arithmetischer Ausdruck, vielleicht voller Matrizen, Tensoren und was nicht alles, soll berechnet werden. Der Kontrollfluss ist egal, weil das Ergebnis immer gleich ist. Trotzdem kann es Fehler geben (eine Matrix stellt sich unerwartet als singulär heraus oder so), und die müssen behandelt werden.

Ohne Exceptions ist das unmöglich, ohne den Code künstlich mit einem festgeschriebenen Kontrollfluß zu verhunzen, wobei er außerdem schwerer lesbar wird. Andererseits richten Exceptions keinen Schaden an: die zusätzlichen Codepfade sind völlig irrelevant, wie schon die vielen potentiell vorhandenen irrelevant sind.

Gute Programmierer denken nicht über Kontrollfluss, sondern über Invarianten nach.

Exception Handling in C++

Diese Seite bezieht sich vorwiegend auf C++, denn dort sind Exceptions am besten analysiert worden und die meisten Erfahrungen gesammelt worden. Ich halte sie dort für nützlich. Die Gurus scheinen sich über den Wert von Exceptions recht einig zu sein. Die Zusammenfassung ist ungefähr:

Was das separate Problem der Exception-Spezifikation betrifft: die halte ich in C++ wie in Java für völlig kaputt. Siehe CheckedExceptionsConsideredHarmful.

Gemeinsam mit deterministischen Destruktoren erlauben es Exceptions, Aufräumcode (meistens die Freigabe von Ressourcen, insbesondere Speicher, Filehandles und Mutexe) genau einmal zu spezifizieren, aber dennoch sicher zu stellen, dass aufgeräumt wird, gleichgültig, ob eine Funktion bis zu ihrem Ende durchläuft oder vorzeitig verlassen wird. Ressourcenfreigaben schreibt man endlich nur noch OnceAndOnlyOnce.

Müssen es unbedingt Exceptions sein?

Wenn man die Notwendigkeit von Exceptions diskutiert, muss man natürlich in Betracht ziehen, welche Alternativen es gibt:

Die Fehlermonade noch ein wenig generalisiert liefert direkt Exceptionhandling (in monadischem Code versteht sich). Vermutlich wird EH in jeder Sprache früher oder später (neu-)erfunden.


Siehe auch:

ISBN 0-13-235088-2 Robert C. Martin: Clean Code, A Handbook of Agile Software Craftsmanship (s.a. CleanCodeDeveloper):

ExceptionsInSpracheLava


KategorieArtikel KategorieException
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 16. August 2009 16:18 (diff))
Suchbegriff: gesucht wird
im Titel
im Text