Anwendung von Exceptions



  • Hallo,

    wann verwendet man eigentlich Exceptions (bei welchen Ausnahmen / bei welchen Fehlern / in welchen Situationen)?

    try
    {
    
    }
    catch()
    {
    
    }
    

    Wird nach einer solchen Exception das Programm im Normalfall verlassen, weil der Fehler so schwerwiegend ist, dass ein weiterarbeiten nicht mehr möglich ist? z.B. konnte eine wichtige Datei nicht geladen werden.

    Wie formatiert man seine Exceptions am Besten, so dass man als User genauso wie als Programmierer sofort weiß was wie wo nicht funktioniert hat?

    Für Anregungen wäre ich euch sehr dankbar 🙂

    Mfg
    Dirk



  • Exceptions verwendet man üblicherweise dazu, um ein Problem, den man im aktuellen Bereich nicht beheben kann an eine übergeordnete Instanz zu übergeben. Der fängt dann, wenn er etwas damit anfangen kann und sonst geht das einfach weiter zurück. Ich (und da bin ich nicht alleine) haben in der main einen try Block, welcher alles fängt, was noch nicht gefangen wurde und mir was auf die Konsole/File ausgibt.

    Man fängt Exceptions eigentlich nur, wenn man etwas damit anfangen kann.

    Während der Entwicklung kannst du den Fehler gleich direkt ausgeben. Wenn du ein Programm auslieferst sollten die Exceptions eigentlich in eine Log umgeleitet werden. Einen Fehler anzeigen kannst du ja vorher noch.



  • drakon schrieb:

    Exceptions verwendet man üblicherweise dazu, um ein Problem, den man im aktuellen Bereich nicht beheben kann an eine übergeordnete Instanz zu übergeben.

    Ich dachte bis jetzt, dass eine Exception lediglich einen Fehler aufzeigt, aber nicht dass diese noch in der Lage sein soll bzw. ist diesen Fehler zu beheben? Oder hab ich jetzt "wenn er etwas damit anfangen kann und sonst geht das einfach weiter zurück" falsch verstanden?

    Kannst du mir vielleicht ein kleines Beispiel für die Verwendung einer solchen Exception noch geben?

    drakon schrieb:

    Während der Entwicklung kannst du den Fehler gleich direkt ausgeben. Wenn du ein Programm auslieferst sollten die Exceptions eigentlich in eine Log umgeleitet werden. Einen Fehler anzeigen kannst du ja vorher noch.

    Ok: d.h. Exceptions sind nur für mich wichtig als Programmierer und für den User später überhaupt nicht vorhanden. D.h. wenn eine Exception beim User statt findet, dann wird nichts angezeigt, sondern der Fehler in ein Logfile geschrieben und fertig.

    Bei welchen Fehlern teilt man es dem User per Software (Dialog etc.) mit?



  • drakon schrieb:

    Wenn du ein Programm auslieferst sollten die Exceptions eigentlich in eine Log umgeleitet werden. Einen Fehler anzeigen kannst du ja vorher noch.

    Exception::GetErrorMessage() -> und diese wird gleich in ein Logfile eingetragen. Verwendet man für die Logfile-Klasse eine globale Variable, so dass man von jeder Exception-Klasse (gibt es ja von jeder Klasse eine eigene, damit man spezifische Nachrichten erstellen kann) auf diese Logfile-Klasse zugreifen kann?



  • Dirk Bauer schrieb:

    drakon schrieb:

    Exceptions verwendet man üblicherweise dazu, um ein Problem, den man im aktuellen Bereich nicht beheben kann an eine übergeordnete Instanz zu übergeben.

    Ich dachte bis jetzt, dass eine Exception lediglich einen Fehler aufzeigt, aber nicht dass diese noch in der Lage sein soll bzw. ist diesen Fehler zu beheben? Oder hab ich jetzt "wenn er etwas damit anfangen kann und sonst geht das einfach weiter zurück" falsch verstanden?

    Doch, doch. Die soll man ggf. noch beheben können. Wäre ja blöde, wenn ich weiss, an was ein Fehler liegt, den aber dann nicht beheben kann.

    Kannst du mir vielleicht ein kleines Beispiel für die Verwendung einer solchen Exception noch geben?

    Z.b möchtest du eine Datei in deinem Programm laden, wovon du ausgehst, dass sie vorhanden ist. Die Klasse, die das lädt stellt dann aber z.B fest, dass sie irgendwie korrupt ist und möchte den Fehler melden. Allerdings soll diese Klasse nicht entscheiden müssen was man in einem solchen Fall machen soll und wirft daher eine Exception. Der Teil, der oben an steht kann dann z.B Default Einstellungen laden oder aber auch das Programm beenden. Je nachdem wie wichtig die Datei war.

    drakon schrieb:

    Während der Entwicklung kannst du den Fehler gleich direkt ausgeben. Wenn du ein Programm auslieferst sollten die Exceptions eigentlich in eine Log umgeleitet werden. Einen Fehler anzeigen kannst du ja vorher noch.

    Ok: d.h. Exceptions sind nur für mich wichtig als Programmierer und für den User später überhaupt nicht vorhanden. D.h. wenn eine Exception beim User statt findet, dann wird nichts angezeigt, sondern der Fehler in ein Logfile geschrieben und fertig.

    Bei welchen Fehlern teilt man es dem User per Software (Dialog etc.) mit?

    Exceptions sollten natürlich bei der Verwendung des Kunden nicht mehr passieren (ok, eigentlich sollten sie gar nie vorkommen), aber wenn sie das tun ist es besser, wenn das ganze sich normal beendet und nicht irgendwie crasht. Dann kannst du auch noch aus dem Logfile auslesen wo genau das Problem lag und kannst den Fehler beheben.

    Welche Fehler man mitteilt ist sehr abhängig was genau das Problem ist. z.B kannst du den User ohne Probleme darauf aufmerksam machen, dass eine Eingabe in einem Textfeld fehlerhaft war, aber wenn eine gewisse Datei korrupt ist oder sonst etwas passiert, dann kannst du vielleicht anzeigen, dass es einen Fehler gab und man die Logdatei anschauen kann oder diese dem Entwickler senden kann.

    Exception::GetErrorMessage() -> und diese wird gleich in ein Logfile eingetragen. Verwendet man für die Logfile-Klasse eine globale Variable, so dass man von jeder Exception-Klasse (gibt es ja von jeder Klasse eine eigene, damit man spezifische Nachrichten erstellen kann) auf diese Logfile-Klasse zugreifen kann?

    Nein, nicht unbedingt. Exceptions fliegen ja überall durch und können somit sowieso auf verschiedenen Scopes vorkommen. Daher kannst du in der main einfach eine solche Logdatei öffnen und den Fehler da reinpacken, wenn er bis dort hin gekommen ist (ich hoffe ich habe diese Frage richtig verstanden).


Anmelden zum Antworten