Was soll man von einer fehlgeschlagenen Methode zurückgeben und wann werfen?

7

Ich habe in letzter Zeit über die Dinge nachgedacht, die ich von den Methoden zurückgebe, und ich habe bemerkt, dass es vier verschiedene Dinge gibt, die ich zurückgebe, wenn die Methode fehlschlägt.

Was mich daran stört, ist, dass mein Code in dieser Hinsicht nicht sehr konsistent ist, also wollte ich nach Ihren "Best Practices" fragen.

Stellen wir uns also eine Methode vor, die Foo übernimmt und eine Liste von Bar zurückgibt:

%Vor%

Oder um es allgemeiner zu halten:

%Vor%

Die Frage ist, was Sie über welche Art von Versagen zurückgeben. Die Optionen wären:

  1. leerer Rückgabetyp wie: neue Liste; oder: new EmptyBar ();
  2. null
  3. eine Ausnahme auslösen
  4. ein spezieller Listenwert, der einen Fehler wie folgt anzeigt: new List {new FailureBar ()}

Ich hasse Option 4 wirklich, also bin ich hauptsächlich interessiert zu hören, wenn du die anderen 3 Optionen verwendest und warum

    
LDomagala 06.04.2009, 10:49
quelle

10 Antworten

13

Ich würde je nach Art des Fehlers zwischen einer leeren Liste und einer Ausnahme wählen.

z. B.

Wenn Ihre Datenbank keine Verbindung herstellen konnte - Ausnahme.

Wenn Ihre Abfrage keine Ergebnisse zurückgegeben hat - leere Liste.

    
Rob Stevenson-Leggett 06.04.2009, 10:53
quelle
4

Es hängt davon ab, was Sie mit "Versagen" meinen.

Wenn es ein Fehler in dem Sinne ist, dass etwas Unerwartetes passiert ist, dann würde ich eine Ausnahme auslösen. Vielleicht eine Argumentausnahme für den Fall, dass der Parameter falsch war, eine IOException, wenn Sie nicht aus der Datei lesen konnten, und so weiter.

Wenn der Fehler darin besteht, dass für den angegebenen Parameterwert keine Elemente gefunden werden konnten, gebe ich eine leere Liste zurück. Falls Sie ein Objekt zurückgeben, das keine Sammlung ist, würde ich null zurückgeben.

Ich gebe nie spezielle Ergebniscodes zurück, wie -1 im Fehlerfall. Ich mag es wirklich nicht. Menschen neigen dazu, Codes zu vergessen, sie ändern sich im Laufe der Zeit, und Sie erhalten schlecht erhaltene Anweisungen, wenn Sie nach diesen Ergebniscodes suchen, und so weiter.

    
Razzie 06.04.2009 10:58
quelle
2

Wenn es einen erwarteten Ausnahmefall gibt, würde ich eine Ausnahme auslösen.

Wenn ich nach Bar gesucht hätte und sie nicht gefunden hätte, würde ich null zurückgeben.

Wenn ich nach List<Bar> gesucht hätte und keine gefunden hätte, würde ich eine leere List<Bar> zurückgeben.

Wenn das Auffinden von null sehr häufig war und es Sinn machte, es zu verwenden, würde ich das Null-Objekt-Muster , und geben Sie EmptyBar zurück.

Also ... Ich denke, es ist fair zu sagen, dass ich jetzt mit Ihren derzeitigen Ansätzen einverstanden bin. Ich würde nur sicherstellen, dass ich in jedem Projekt konsequent war und nicht Mix & amp; passen Sie verschiedene Ansätze mit verschiedenen Fällen an.

    
Aaron Daniels 06.04.2009 11:42
quelle
1

Ich würde es auf eine Ausnahme oder leere Rückkehrliste reduzieren, um es so einfach wie möglich zu halten

  1. leerer Rückgabetyp wie: neue Liste; oder: new EmptyBar ();

Sie sollten dies zurückgeben, wenn der Vorgang zum Füllen der Liste korrekt und ohne offensichtlichen Fehler abgeschlossen wurde, aber keine Ergebnisse zurückgegeben werden - da dies IMO impliziert. Dies bedeutet auch, dass Code, der von der Rückgabe abhängig ist, die (zum Beispiel) die Liste durchläuft, keine spezielle Behandlung benötigt.

  1. eine Ausnahme auslösen

IMO-Ausnahmen sollten ausgelöst werden, wenn in der Funktion ein Fehler aufgetreten ist - z. Datei kann nicht geöffnet werden, Verbindung kann nicht hergestellt werden usw. Berechnung hat Müll zurückgegeben - Dies unterscheidet sich von "keine Ergebnisse zurückgegeben"

    
NotJarvis 06.04.2009 12:35
quelle
1

Wenn keine Elemente gefunden werden, geben Sie eine leere Liste zurück. Dies ist ein besonderer Fall des Null-Objekts -Musters. Es hilft, alle Fälle konsistent zu behandeln, was bedeutet, dass Clients nicht prüfen müssen, ob der Wert null ist. Oder, noch schlimmer, wenn sie nicht überprüfen, wird eine Null-Zeiger-Ausnahme ausgelöst und ein glückliches Debugging durchgeführt, um herauszufinden, was die Ursache ist. Gib nur null zurück, wenn du einen sehr guten Grund dafür hast.

Update : Martin Fowler beschreibt eine bessere Alternative zur Rückgabe von null: Ссылка

>

Aber wirf eine Exception aus, wenn sich deine Methode nicht so verhält, wie sie sollte, Datenbank Exceptions, Stream Exceptions, etc.

    
Andrei Vajna II 06.04.2009 11:43
quelle
0

Wenn Ihre Geschäftslogik abhängig davon, was Method zurückgibt, variieren kann und es somit für Ihre Methode in Ordnung ist, eine leere Liste zurückzugeben, gehen Sie mit 1) fort.

Eine Ausnahme auslösen, wenn Ihre Geschäftslogik keine leere Liste haben soll. Wenn es wegen falsch übergebenen "Foo etwas" geht, geh mit Assert oder logischer Ausnahme. Wenn es wegen externer Datenproblem wie Datenbankverbindung oder Dateisystemfehler dann ggo mit Laufzeitausnahme ist.

Geh nie mit 4) es wird sehr schwer sein, dieses Verhalten später zu verstehen.

    
Mykola Golubyev 06.04.2009 10:55
quelle
0

Fall 1:

Wenn Methode ein Problem entdeckt, was nicht erwartet wird, sollte es eine Ausnahme auslösen. Der aufrufende Code sollte auf Ausnahme

achten

Fall 2:

Alle anderen Fälle Methode sollte Null / leer / Liste mit Werten zurückgeben. Die aufrufende Funktion sollte auf null und leer achten.

    
NileshChauhan 06.04.2009 10:57
quelle
0

Ich bin mir nicht sicher, ob diese allgemein angewendet werden können, aber ich fühle mich ziemlich wohl mit folgenden Regeln:

  1. Wenn der Methodenname DoFoo lautet, sollte er ausgelöst werden, wenn er Foo aus irgendeinem Grund nicht ausführen kann: Die Netzwerkressource ist nicht verfügbar, Foo wird von dieser bestimmten Implementierung der Schnittstelle nicht unterstützt, das Objekt befindet sich in einem inkonsistenten Zustand etc.
  2. Wenn der Name der Methode GetBar lautet, gibt es eine weitere Option: null zurückgeben. Aber es ist besser, dies zu widerspiegeln, indem man es wie TryGetBar, GetBarOrNull usw. benennt. Natürlich sollte der Null-Rückgabewert etwas Besonderes anzeigen und eine Antwort auf jede außergewöhnliche Bedingung sein.
Dmitry Ornatsky 06.04.2009 11:00
quelle
0

Ich würde nur dann eine Exception auslösen, wenn etwas mit dem, was ich versuche, in Konflikt gerät, wie zB falsche Eingabeparameter, Datenbankfehler usw.

Normalerweise gebe ich in den meisten anderen Fällen eine Null zurück, weil die Suche nach Nullen natürlich ist, aber ich würde eine leere Liste zurückgeben, wenn die Daten, die sie enthalten sollen, einfach leer sind.

    
SirDemon 06.04.2009 11:02
quelle
0

Hier sind zwei Fragen zu beantworten:

  • Ist ein Fehler der Funktion konzeptionell anders als eine normale Ausführung mit einem leeren Ergebnis? Könnte ein Anrufer realistisch wissen, welcher dieser Fälle passierte? Wenn dies der Fall ist, ist die Rückgabe einer leeren Liste keine Option. Ich denke, theoretisch könnte man eine "spezielle" leere Liste zurückgeben, aber das ist eine Verschleierung.
  • Wenn die Funktion fehlschlägt, wer muss normalerweise reagieren? Wenn es sich nicht um den sofort aufrufenden Code handelt, sondern um etwas höher stehendes, ist eine Exception die sauberste Lösung.
Michael Borgwardt 06.04.2009 12:27
quelle

Tags und Links