Rückgabe von Berechnungsergebnissen



  • Warum könnte man die Fehlerbehandlung mittels trycatch
    auch als „dritte Art“
    für die Rückgabe von Berechnungsergebnissen in einer Funktion missbraucht werden?
    Was wären die „erste“ und „zweite“ Art der Rückgabe von Berechnungsergebnissen
    einer Funktion in C und C++?



    1. direkte Rückgabe als Funktionsrückgabewert
    2. mittels eines Zeiger- oder Referenzparameters

    Und nun überlege mal, wie du per try-catch einen Wert aus einer Funktion erhalten könntest (was aber nicht dazu gedacht ist).



  • Tut mir leid, so weit bin ich noch nicht das ich mir etwas ausdenken kann. Bin noch im zweiten Semester eines normalerweise nicht Informatik Studiengangs, weshalb mir das etwas schwer fällt.

    Kurze frage noch, was wäre in der Frage der "Missbrauch"? Das die Fehler im Programm ignoriert werden und der Ablauf nicht unterbrochen wird?



  • @Betacoder sagte in Rückgabe von Berechnungsergebnissen:

    Kurze frage noch, was wäre in der Frage der "Missbrauch"?

    Exceptions sind, wie der Name schon sagt, für Ausnahmen da. Nicht für normalen Control-Flow.



  • Achso, so eine ganz pragmatische Antowort war gefragt. Vielen dank an die Helfer!


  • Mod

    @Betacoder sagte in Rückgabe von Berechnungsergebnissen:

    Achso, so eine ganz pragmatische Antowort war gefragt. Vielen dank an die Helfer!

    Neben der philosophischen Antwort, dass sie nicht dafür gedacht sind, gibt es auch recht konkrete Gründe dagegen:

    • Da sie nicht für Ausnahmen gedacht sind, ist der Mechanismus dafür sehr langsam (im Vergleich zu den anderen Methoden)
    • Da sie nicht dafür gedacht sind, gibt es lauter Sonderregeln, die einen beißen können und werden. Beispielsweise: Was passiert, wenn der Rückgabewert selber eine Exception verursacht? Bei den anderen Mechanismen ist dies wohldefiniert und intuitiv.

    Weitere philosophische Gründe dagegen:

    • Man baut sich einen Wartungsalptraum, weil der Kontrollfluss nicht mehr klar ist. Bei einem normalen Funktionaufruf ist klar, was mit den Rückgabewerten passiert und wer die Verantwortung dafür hat. Relevante Codestellen sind genau die Funktion selbst, und die aufrufende Stelle. Exceptions können hingegen von wer weiß wem, wer weiß wo gefangen werden. Man muss sich vollständig aller Ebenen des Callstacks (die ja auch dynamisch unterschiedlich sein können!) bewusst sein, wenn man vorhersagen will, was genau mit der missbrauchten Exception passiert. Das ist quasi wie ein longjmp mit dynamischen Labels! Und das wenn schon goto mit statischen Labels zu Spagetticode führt.
      (Tatsächlich ist longjmp mit dynamischen Labels die Art und Weise, wie man Exceptions in Sprachen programmieren würde, die keinen nativen Support dafür haben)

Log in to reply