Wann exceptions werfen?



  • destruktör schrieb:

    Weil in C++ schnell alles explodiert mit RAII und Exceptions. Praktisch darf nichts was im Destruktor an Aufräumarbeiten gemacht wird eine Exception aus dem Destruktor werfen, weil sonst im Falle einer anderen Exception alles crasht.

    Was passiert in Java, wenn eine Exception geworfen wird und deswegen irgendwann später vom GC ein Objekt vielleicht zerstört wird, das eine Schreibdatei offen hat? Was soll der Destruktor des Objektes machen, wenn das zerstören der Datei nicht die letzten paar Bytes rausschreiben kann? Nix natürlich, wobei wir wieder bei meiner These sind.



  • Exception im Destruktor werfen ist eh ne ganz blöde Sache.
    Bei Sachen wie Dateifunktionen ist es sicher nicht verkehrt, mal ein false zurückzugeben, wenn die zu kopierende Datei nicht gefunden wurde oder das Ziel bereits existiert. Wenn allerdings ein anderer Fehler auftritt, ist eine Ausnahme angebracht.



  • sebi707 schrieb:

    Das Video mit Expected<T> hast du gesehen? Ich habe es selbst noch nicht benutzt aber ich finde es sehr praktisch, dass dort beide Ansätze vereint werden.

    Ja habe ich 🙂
    Ich werde mir die Tage überlegen ob ich das so machen werde. Über Weihnachten wird woch nicht so viel passieren.

    ...wünsche euch allen noch schöne Feiertage 🙂



  • volkard schrieb:

    destruktör schrieb:

    Weil in C++ schnell alles explodiert mit RAII und Exceptions. Praktisch darf nichts was im Destruktor an Aufräumarbeiten gemacht wird eine Exception aus dem Destruktor werfen, weil sonst im Falle einer anderen Exception alles crasht.

    Was passiert in Java, wenn eine Exception geworfen wird und deswegen irgendwann später vom GC ein Objekt vielleicht zerstört wird, das eine Schreibdatei offen hat? Was soll der Destruktor des Objektes machen, wenn das zerstören der Datei nicht die letzten paar Bytes rausschreiben kann? Nix natürlich, wobei wir wieder bei meiner These sind.

    Ich hab schon ewig nichts mehr mit Java gemacht, seit wann gibt es da Destruktoren?


  • Mod

    destruktör schrieb:

    volkard schrieb:

    destruktör schrieb:

    Weil in C++ schnell alles explodiert mit RAII und Exceptions. Praktisch darf nichts was im Destruktor an Aufräumarbeiten gemacht wird eine Exception aus dem Destruktor werfen, weil sonst im Falle einer anderen Exception alles crasht.

    Was passiert in Java, wenn eine Exception geworfen wird und deswegen irgendwann später vom GC ein Objekt vielleicht zerstört wird, das eine Schreibdatei offen hat? Was soll der Destruktor des Objektes machen, wenn das zerstören der Datei nicht die letzten paar Bytes rausschreiben kann? Nix natürlich, wobei wir wieder bei meiner These sind.

    Ich hab schon ewig nichts mehr mit Java gemacht, seit wann gibt es da Destruktoren?

    Er meint (vermutlich) die Finalize-Methoden, die so etwas ähnliches wie ein Destruktor in Java sind. Kommt halt drauf an, wie man das Konzept eines Destruktors genau definiert. Mit dem Sprachkonzept der deterministischen Destruktoren in C++ (welches meiner Meinung nach ein sehr starkes Konzept ist, und einer der Hauptvorzüge von C++*) haben die Finalizers meiner Meinung nach nur oberflächlich zu tun.
    Was dann auch volkards Aussage erklärt.

    *: Um so mehr ist es schade, dass viele schlechte Lehrer und Lehrbücher sich dessen überhaupt nicht bewusst sind.



  • Das einzige, was dem C++-Destruktor bei Exceptions in Java halbwegs nahekommt, war früher die umständliche finally-Anweisung und seit Java 7 die try-with-resources-Anweisung, wobei das Interface closeable implementiert sein muss.



  • bonner ultra schrieb:

    Das einzige, was dem C++-Destruktor bei Exceptions in Java halbwegs nahekommt, war früher die umständliche finally-Anweisung und seit Java 7 die try-with-resources-Anweisung, wobei das Interface closeable implementiert sein muss.

    Dabei wiederum ist es zulässig und vollkommen legal und wohldefiniert, Exceptions zu werfen wie man gerade Lust hat. Egal ob eine oder mehrere, alles passiert vorhersehbbar.



  • SeppJ schrieb:

    destruktör schrieb:

    volkard schrieb:

    destruktör schrieb:

    Weil in C++ schnell alles explodiert mit RAII und Exceptions. Praktisch darf nichts was im Destruktor an Aufräumarbeiten gemacht wird eine Exception aus dem Destruktor werfen, weil sonst im Falle einer anderen Exception alles crasht.

    Was passiert in Java, wenn eine Exception geworfen wird und deswegen irgendwann später vom GC ein Objekt vielleicht zerstört wird, das eine Schreibdatei offen hat? Was soll der Destruktor des Objektes machen, wenn das zerstören der Datei nicht die letzten paar Bytes rausschreiben kann? Nix natürlich, wobei wir wieder bei meiner These sind.

    Ich hab schon ewig nichts mehr mit Java gemacht, seit wann gibt es da Destruktoren?

    Er meint (vermutlich) die Finalize-Methoden, die so etwas ähnliches wie ein Destruktor in Java sind. Kommt halt drauf an, wie man das Konzept eines Destruktors genau definiert. Mit dem Sprachkonzept der deterministischen Destruktoren in C++ (welches meiner Meinung nach ein sehr starkes Konzept ist, und einer der Hauptvorzüge von C++*) haben die Finalizers meiner Meinung nach nur oberflächlich zu tun.
    Was dann auch volkards Aussage erklärt.

    Was genau ist seine Aussage? Soll man in Java wie in C++ programmieren? Wer verwendet diese finalize-Methoden?


Anmelden zum Antworten