Hallo Martin,
Du hast sowieso eine etwas ungewöhnliche Programmierphilosophie, ich schiebe das mal auf zu viel Assembler ;-)
Ich gestalte meine Funktionen immer so, dass sie
a) in eingfachen Fällen das gewünschte Resultat oder einen klar definierten Fehlerwert liefern
b) oder grundsätzlich nur einen Statuscode zurückgeben (in der Regel 0 für erfolgreiche Ausführung), und ihre "Nutzlast" über Argumente, die als Referenz übergeben werden.
Bei b) verwendest Du also keine Funktionen im eigentlichen Sinne. Bei solchen "Prozeduren" hat man z.B. auch nicht mehr die Möglichkeit, sie direkt ineinander einzusetzen. Du scheinst einen recht wenige funktionalen Programmierstil zu pflegen.
Das muss man im Prinzip sowieso. Ob man eine Handvoll Exceptions bastelt oder ein Funktionsergebnis auf ein paar konkrete Werte abprüft, läuft ungefähr auf dasselbe hinaus.
Man muss aber die eigentliche Berechnung nicht durch Fehlerbehandlung "verschmutzen". Ein Fehler führt zum Ausbruch aus dem normalen Ablauf und man kann den Fehler direkt behandeln. Zudem ist es eben einfach Fehlerbehandlung weiter zu reichen. Bei Rückgabewerten hat jede Funktion ihre eigene Fehler-Konvention.
Ich hab durchaus auch schon in Sprachen bzw mit Bibliotheken programmiert, wo das so gehandhabt wird. Oft führt das sogar dazu, dass der Fehlerrückgabewert einfach ignoriert und mit diesen Daten dann irgendwie weitergearbeitet wird.
Man kann es manchmal mit Exceptions übertreiben. Das ist meist dann der Fall, wenn ein Fehler eben kein Abbrechen (eines Teils) des normalen Programmablaufes bedeutet.
Genau das führt meiner Ansicht nach zu schwer durchschaubarem "Spaghetti-Code". Exceptions vermeide ich, wenn immer es geht, weil -da stimme ich frankx aus vollem Herzen zu- sie aus dem regulären Programm- oder Kontrollfluss ausbrechen.
Was machst Du, wenn Du eine in einem Programm lesen musst, aber das nicht kannst? Musst Du da nicht aus dem regulären Kontrollfluss ausbrechen?
Macht man das aber konsequent, ist das eine saubere Sache.
Mit diesem "Fehlercodes über den Rückgabewert, Daten über Referenzen"-Ansatz geht es vermutlich halbwegs. Schließlich hat man dann den Rückgabewert zum Fehlerpfad umfunktioniert und damit einen Teil des Exceptions-Konzepts quasi schon umgesetzt.
Man muss diesen natürlich immer noch selbst weiterreichen und vermischt normalen mit Fehlerkontrollfluss. Programme dieser Art finde ich eigentlich meist umständlicher als nötig.
Grüße
Daniel