cloidnerux hat geschrieben:Die Frage war aber eigentlich nach den Exceptions. Heißt Deine vorherige Antwort, dass sie einen anderen Vorteil haben oder dass sie überhaupt keinen Vorteil haben!?
C++ wurde auch nicht von Deppen geplant, von daher haben auch Exceptions einen nutzen. Das sie nun aber mehr schlecht als recht umgesetzt wurden, ist halt ein manko.
Weder sind Exceptions nutzlos, noch sind sie schlecht umgesetzt.
Sie sind nur schlecht genutzt.
Weil sie eigentlich fast nur schlecht genutzt werden, frage ich mich, ob es nicht mehr Sinn ergibt keine Exceptions zu ermöglichen und damit auf den Sinn von Exceptions zu verzichten, den ich noch nie verwendet gesehen habe.
Das Exceptionhandling von C ist eigentlich besser als das von C++/Java/C#. (Ja, es gibt ein Exceptionhandling in C - nur eben viel weniger, also benutzt man es auch nur in Ausnahmen).
cloidnerux hat geschrieben:Was ich aber daran auch gut Finde, ist das man als Programmierer auch mal einen Fehler behandeln muss.
Ich arbeite als professioneller Softwareentwickler und ich bin sehr bemüht, Fehler korrekt zu behandeln. Aus dieser Pespektive sage ich Dir, dass in der professionellen Softwareentwicklung es durchaus üblich ist Exceptions durch Ignorieren zu behandeln. Sie
müssen ja behandelt werden: Klammer auf, Klammer zu, fertig. Damit sind Fakten geschaffen worden. Der Fehler ist nie aufgetreten, wird nie erwartet und
muss trotzdem behandelt werden. Und nun wird er auch nie wieder auftreten.
Tritt diese Exception nun doch auf, verkompliziert sich die Fehlersuche massiv. Und das kommt unter'm Strich dabei heraus. Das ist übrigens der optimistische Fall. Häufig findet man auch catch( Exception e ) {}, da verfängt sich dann auch alles, was später mal entwickelt wurde und beliebige Exceptions wirft.
Statt eines einfachen Fehlers habe ich nun einen eventuell mächtig komplizierten.
cloidnerux hat geschrieben:Das war bei einem Rückgabewert von fopen und co nicht so, habe ich es nicht kontrolliert ist es wo anderst abgestürzt.
So muss ich die Exception fangen und kann dann auch sagen, wo das Problem jetzt lag.
Oder die Exception verfängt sich, wird als bearbeitet definiert und das Objekt, dass nicht geladen werden konnte als valide.
So fliegt eine neue Exception, die sich - wenn Du Glück hast - nicht verfängt und Du findest ein invalides Objekt und hast keine Ahnung, warum das invalid ist. Seit dem Ladevorgang sind viele Anweisungen vergangen.
Mein persönlicher Rekord im Exception-Ping-Pong sind drei Sätze. Das Programm crasht für Objekt A und warf eine Exception, die ignoriert wurde, was dazu führte, dass anderswo eine Exception für Objekt B geworfen wurde, die ignoriert wurde, was dazu führte, dass eine dritte Exception geworfen wurde, weil nun Objekt B krankt, die auch ignoriert wurde, was dazu führte, dass das Programm in meinem Abschnitt an einer Stelle fehlschlug, die ich wie blöd getestet habe und die definitiv funktionierte. Es kam aber halt ein absolut kaputtes Objekt C in den Algorithmus. Und jetzt muss man den Fall finden, an dem Objekt A die Exception wirft und den Ablauf, der dazu führt, dass über ein kaputtes B ein kaputtes C bei mir ankommt.
Das Debuggen hat mich
sehr viel Zeit gekostet, ich habe dabei reichlich Fehler von Kollegen gefixt aus Bereichen, mit denen ich überhaupt gar nichts zu tun hatte. Da muss man erst mal verstehen, was da abgeht. Ich habe einen Netzwerkservice programmiert und dabei Interna einer Suchmaschine gefixt. Das macht mich nicht gerade produktiv, wenn es darum geht meinen Auftrag - den Netzwerkservice - zu erledigen.
Das ist professionelle Softwareentwicklung mit Exceptions.
Wäre der Ladevorgang in Deinem Beispiel fehlgeschlagen, weil Du fopen() nicht kontrolliert hättest, wäre das ein direktes Resultat, weil der FileStream invalid ist, Du baust die Abfrage bei fopen ein und fertig. Die Wirkung ist direkt mit der Wirkung verbunden.
Darum vermeide ich Exceptions: Zu teuer in der Entwicklung. Ich schreibe - privat - Compiler, Netzwerkdienste, Suchmaschinen, Wikis. Nicht in Vollzeit. Eine derartige Exception-Debugging-Session kann mich ein halbes oder ein ganzes Jahr kosten. Exceptions sind für mich kein kalkulierbares Risiko.
Man kann jetzt sagen, dass die Entwickler entsprechend dämlich sind - und das stimmt - aber die Fehlerbehandlung von Exceptions ist aufwendig, der Druck Features fertig zu stellen groß und wenn's erstmal funktioniert, dann läuft's doch... Professionelle Entwickler sind auch nur Menschen. Wenn die Wenn die Fehlerbehandlung von ausgebildeten Informatikern derart verhunzt wird, wer soll dieses Sprachfeature dann korrekt anwenden?
Exceptions sollen in der Theorie Fehler bekämpfen.
Meiner Erfahrung nach machen sie in der Realität Software irreparabel kaputt. Müsste ich ein Jahr wegen eines Exception-Ping-Pongs debuggen, müsste ich irgendwann alle Projekte am Stück sterben lassen, da alle meine Projekte auf der selben Codebasis laufen. Was als URL in den Webserver reinkommt, geht als Datentyp 'url' durch den Compiler, wird vom Wiki als Linksammlung verwendet.
In der Firma, in der ich jetzt arbeite haben wir auch Exceptions. Es gibt eine Assert-Makro, die eine Exception wirft. Schlägt das Assert fehl finde ich mich urplötzlich in der Exeptionbehandlung wieder, die erklärt, dass welches Assert explodiert ist. Werte? Stacktrace? Ich weiß nur, dass eine Bedingung nicht erfüllt wurde. Das kann ein Assert auch nicht leisten, denn mehr als eine Bedingung, die erfüllt sein soll, hat es nicht.
Ich habe dieses Makro jetzt mit einem Präprozessor-Schalter für mich geändert. Schlägt das Assert fehlt, schreibe ich auf Adresse 0 den Wert 0. Das Programm hängt sich sofort auf, Visual Studio bleibt stehen und ich stehe genau an der Stelle, an der das Assert hakt, kann mir den Stacktrace und alle Werte betrachten.
Ob ich den Eintrag ins Protokoll über das Makro schreibe oder über ein catch() spielt für das Log keine Rolle. Für mich aber schon.
Genauso mache ich es mit dem GCC, ich es gibt sogar eine Klasse XSD::Util::Crash, die zuerst die Ankündigung des Crashs ins Log einträgt und dann einen tödlichen Fehler initiiert. gdb hält an und ich kann mir gemütlich angucken, wie ich hier eigentlich hingekommen bin und warum.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.