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