Exception oder NULL?
-
Guten Morgen!
Ich frage mich gerade, ob ich für eine Methode einen Zeiger mit 0 als Rückgabewert oder eine Exception werfen soll bei einem Fehlerfall. Angenommen sei z.B. folgende Deklaration:
Item* Foo::CreateItem( const std::string& id );Oder eben:
Item& Foo::CreateItem( const std::string& id );Die Methode erstellt in Foo-Instanzen Item-Objekte, behält hier aber den Ownership (daher keine Fabrik). Es kann allerdings vorkommen, dass 'id' bereits belegt ist. In diesem Fall wird kein Item-Objekt erzeugt.
Würde man hier eher einen 0-Zeiger zurückgeben oder eine Exception werfen? Von der Semantik finde ich die zweite Variante hübscher, da eine Referenz m.M. nach den Ownership deutlich macht.
Gruß,
Stefan.
-
kommt drauf an. Wenn es schonmal vorkommen kann, dass die gleiche ID gewählt wird, würde ich über nen Null-Pointer (oder gar einem Pointer auf das selbe Objekt, das beim letzten mal zurückgegeben wurde) reagieren.
Ist es aber eher die Ausnahme, die evtl. sogar in einem Log vermerkt werden soll, würde ich eine Exception werfen
-
Es kann die gleiche ID gewählt werden, darf aber eigentlich nicht.
Hier mal ein konkretes Beispiel:Es gibt eine Klasse "AccountManager" für Benutzerkonten. Um eins hinzuzufügen, bzw. genauer: zu erstellen, wird AccountManager::Create() gerufen, mit dem eindeutigen(!) Benutzernamen als Parameter.
Nun ist es so, dass es ein verwaltendes Interface gibt (ob das nun in einer Konsole, GUI oder sonstwie läuft, ist ja egal), in dem ein Benutzer einen neuen Account anlegen darf. Und der kann natürlich einen bereits vergebenen Benutzernamen wählen.
Lange Rede, kurzer Sinn: Es wäre also wirklich eine Ausnahme (nicht Exception ;)), weil das Erzeugen eines neuen Kontos nicht möglich ist. In einem Log würde das eher nicht vermerkt, die Anwendung muss aber auf alle Fälle darauf reagieren.
-
Merke: Falsche Benutzereingaben sind nie Ausnahmen (Exceptions).
Ich würde da allerdings nicht drauf warten dass irgendeine create-Methode einen nullpointer liefert sondern gleich ne Abfrage starten "war das was der user da eingetippt hat überhaupt sinnvoll?" und dabei prüfen, obs zu dem Namen schon einen Account gibt. Wenn die Eingabe ok ist, dann kanns weitergehn und wen dann das create fehlschlägt ist wirklich irgendwas im Argen und du wirfst eine Eception.
-
Finde ich einen guten Ansatz. Danke euch beiden.

Dass falsche Benutzereingaben nie Exceptions sind, macht auch Sinn, Danke dafür.