Ausnahmen in C#



  • Hey Leute,
    mal eine Frage zu den Ausnahmen, eher zur Nutzung von Ausnahmen in C#.
    Also bei C++ habe ich es so gelernt, dass man eine Ausnahme nur werfen soll, wenn es auch wirklich eine Ausnahme ist, also ein unerwarteter Fehler und nicht bei jedem Mist.
    Ist dies bei C# ebenso? Ich habe gehört, dort würden Exceptions viel öfter verwendet. Als Beispiel wäre da die Verwendung bei allen möglichen Arten von Plausibilitätsprüfungen( also eine Funktion erwartet eine Zahl in einem bestimmten Wertebereich die der User vorher eingeben muss ). Ist dies wirklich so?

    Vielen Dank schonmal



  • Beides. Ausnahmen natürlich nur auslösen, wenn es wirklich Ausnahmen sind. Aber die werden in C# auch viel öfter verwendet als in C++. Auch bei Plausibilitätsprüfungen, ja. Gibt ja auch genug vordefinierte Exceptions für sowas, z.B. InvalidArgumentException.



  • Wobei die Erschaffer von .NET schnell festgestellt haben, dass eine Ausnahme bei jeder Plausibilität schnell auf die Leistung gehen kann, weshalb später die ganzen TryParse Methoden aufgenommen wurden.

    Aber auch hier gilt: Ausnahmen, wenn es Ausnahmen sind (z.B. beim Parsen einer Zahl in einem Netzwerkprotokoll oder aus einem Textfeld, welches nur Ziffern zulassen sollte), und Kontrollen, wenn Fehler zu erwarten sind (z.B. beim Parsen einer Zahl aus einem Textfeld, welches nicht nur Ziffern zulässt).



  • Ok erst mal danke 🙂
    Also noch ein Beispiel, wo man angeblich eine Exception wirft: Wenn ich ein Vokabelheft habe und ein neues Vokabelpaar hinzufügen möchte und das Heft voll ist. Aus C++ kenn ich es so dass ich dann einfach eine Meldung ausgebe und vll einen entsprechenden Rückgabewert, damit die aufrufende Funktion das ganze erkennt. Aber wirft man dann hier in C# tatsächlich auch eine Exception?


  • Administrator

    fr33g schrieb:

    Aus C++ kenn ich es so dass ich dann einfach eine Meldung ausgebe und vll einen entsprechenden Rückgabewert, damit die aufrufende Funktion das ganze erkennt. Aber wirft man dann hier in C# tatsächlich auch eine Exception?

    Das macht man sogar in C++ so. Rückgabewerte für Fehlerwerte sind in C üblich, wo man keine Exceptions hat. Einen Fehler direkt auf der Konsole ausgeben, ist fast nirgends eine gute Idee. Man kann es allenfalls einer Logging-Bibliothek melden.

    Vielleicht solltest du dir mal die folgenden drei Artikel zu Exceptions in C++ aus unserem Magazin durchlesen:
    Exception-Handling
    Modernes Exception-Handling Teil 1 - Die Grundlagen
    Modernes Exception-Handling Teil 2 - Hinter den Kulissen

    Man kann hier allenfalls eine Funktion anbieten, welche prüft, ob das Heft schon voll ist, damit der Programmierer eine Prüfung machen kann, bevor er das Paar einfügt.

    Die einzigen zwei wirklichen Unterschiede zwischen C++ und C# bei den Exceptions fällt mir vor allem bei den Parametern von Funktionen und dem Fehlen von undefiniertem Verhalten, bzw. ersetzen durch Exceptions, ein. In C++ fährt man den aus C bekannten Weg, welcher besagt, dass die Dokumentation spezifiziert, was man übergeben muss. Wenn man etwas falsches übergibt, resultiert dies in undefiniertem Verhalten. Dahinter steckt wahrscheinlich ursprünglich eine gewisse Performanceüberlegung, es ist aber fraglich, wie viel Performance man dadurch tatsächlich gewinnen kann. Inzwischen ist es mehr einfach eine übliche Vorgehensweise.

    In C# setzt man halt mehr auf Sicherheit und genaue Fehler. Da es sowieso kein undefiniertes Verhalten wie in C++ gibt, probiert man die Laufzeitfehler möglichst genau zu machen. Wenn man z.B. auf eine Nullreferenz zugreift, bekommt man in C# von der CLR eine NullReferenceException . Statt dass die irgendwo auftaucht, probiert man halt sowas frühzeitig abzufangen, indem man die übergebenen Parameter einer Funktion prüft und dann eine ArgumentNullException wird. Für andere Fehlermöglichkeiten gilt dies natürlich dementsprechend. Das erleichtert die Fehlersuche, vor allem wenn man eine Bibliothek nutzt. Sonst kommt die NullReferenceException irgendwo aus dem Code der Bibliothek und man hat keine Ahnung was los ist.

    Grüssli


Anmelden zum Antworten