Soll ich null zurückgeben oder eine Ausnahme auslösen?

8

Ich habe hier Fragen gefunden Sollte eine Abrufmethode "null" zurückgeben oder eine Ausnahme auslösen, wenn es möglich ist 't produzieren den Rückgabewert? und Sollen Funktionen null zurückgeben oder ein leeres Objekt? , aber ich denke, mein Fall ist ganz anders.

Ich schreibe eine Anwendung, die aus einem Webservice und einem Client besteht. Der Webservice ist dafür verantwortlich, auf Daten zuzugreifen und Daten an den Client zurückzugeben. Ich entwerfe meine App so:

// webservice

%Vor%

// Kunde:

%Vor%

Nun, es gibt eine Regel, die nicht null zurückgibt. Ich denke nicht, dass ich eine Ausnahme einfach erneut auslösen und den Client SoapException abfangen sollte. Was ist dein Kommentar? Gibt es einen besseren Ansatz, um dieses Problem zu lösen?

Danke.

    
Vimvq1987 19.10.2010, 15:29
quelle

11 Antworten

4

In Ihrem Fall wurde bereits eine Ausnahme in Ihrem Web-Service ausgelöst und behandelt.

Die Rückgabe von null ist eine gute Idee, weil der Client-Code wissen kann, dass etwas in Ihrem Web-Service fehlerhaft ist.

Im Fall des Kunden denke ich, dass es gut ist, wie Sie es haben. Ich glaube nicht, dass es einen Grund gibt, eine weitere Ausnahme auszulösen (obwohl Sie nicht mehr im Web-Service sind).

Ich sage das, weil technisch nichts einen Fehler in Ihrem Client-Code verursacht hat. Sie erhalten nur schlechte Daten vom Webservice. Dies ist nur eine Frage der Handhabung von möglicherweise schlechten Eingaben von einer externen Quelle.

Persönlich, als Faustregel, scheue ich es, Ausnahmen auszulösen, wenn ich schlechte Daten bekomme, da der Client-Code das nicht kontrollieren kann.

Stellen Sie nur sicher, dass Sie die Bedingung data == null so behandeln, dass Ihr Client-Code nicht abstürzt.

    
Robert Greiner 19.10.2010 15:33
quelle
4

Generell versuche ich, meine Webservices so zu gestalten, dass sie ein Flag zurückgeben, das anzeigt, ob ein technischer / funktioneller Fehler aufgetreten ist oder nicht. Außerdem versuche ich, ein komplexes Objekt für das Ergebnis zurückzugeben, nicht nur eine Zeichenkette, so dass ich Dinge wie:

zurückgeben kann

result- & gt; Code="WARTUNG" Ergebnis- & gt; MaintenanceTill="2010-10-29 14:00:00"

also für einen Webservice, der mir eine Liste von dataEntities bringen soll, werde ich etwas zurückgeben wie:

%Vor%

Damit ist jeder Fehler, der hinter meinem Webservice auftreten kann, in einem Fehler versteckt. Die einzigen Ausnahmen, die Entwickler beim Aufruf meines Webservice beachten müssen, sind die Ausnahmen oder Fehler, die vor dem Webservice auftreten können.

    
Stephan Schinkel 29.10.2010 09:33
quelle
2

Alle von mir verwendeten WebServices geben Objekte zurück, keine einfachen Datentypen. Diese Objekte enthalten normalerweise einen bool -Wert namens Success , mit dem Sie sehr schnell testen können, ob Sie den zurückgegebenen Daten vertrauen oder nicht. In jedem Fall denke ich, dass Fehler, die ausgelöst werden, nicht auffindbar (d. H. Unbeabsichtigt) sein sollten und daher ein Problem mit dem Dienst selbst bedeuten.

    
Brad 19.10.2010 15:37
quelle
2

Ich denke, es gibt einige Faktoren, die bei einer Entscheidung berücksichtigt werden müssen:

  • Was ist der idiomatische Weg, dies in der Sprache zu tun, die Sie benutzen (wenn es kein Webservice war)
  • Wie gut ist Ihre Soap / Webservice-Bibliothek? (Exportiert sie Ausnahmen oder keine)
  • Was ist die einfachste Sache für den Kunden zu tun

Ich tendiere dazu, dass der Klient die einfachste, idiomatische Sache innerhalb der Grenzen der Bibliothek macht. Wenn die Client-Bibliothek sich nicht um das automatische Wiederherstellen von serialisierten Ausnahmen kümmert, würde ich sie wahrscheinlich mit einer Lib umbrechen, die das Folgende ermöglicht:

Kunde:

%Vor%

WebService:

%Vor%     
dietbuddha 29.10.2010 07:36
quelle
2

Ihr erstes Problem ist "eine Regel, die nicht null zurückgibt". Ich würde dringend vorschlagen, das zu überdenken.

Das Zurückgeben einer SoapException ist eine Möglichkeit, aber wie bereits erwähnt, wäre es besser, ein komplexes Objekt mit einer Statusflag {Success, Fail} bei jeder Antwort vom Webservice zurückzugeben.

    
Matt H. 29.10.2010 14:57
quelle
1

Wenn Ihr Client und Dienst auf verschiedenen Rechnern oder auf verschiedenen Prozessen läuft, ist es unmöglich , einen Fehler vom Dienst zu erzeugen und ihn auf dem Client abzufangen. Wenn Sie darauf bestehen, Ausnahmen zu verwenden, ist das Beste, auf das Sie hoffen können, ein Proxy auf dem Client, der die Fehlerbedingung (entweder null oder eine andere Konvention) erkennt und eine neue Ausnahme erneut auslöst.

    
Mark Ransom 25.10.2010 21:52
quelle
1

Ich denke, alles läuft auf die Frage hinaus, ob Ihr Kunde irgendwelche Informationen dazu verwenden kann, warum keine Daten zurückgegeben wurden.
Zum Beispiel - wenn keine Daten zurückgegeben wurden, weil der Server (zB sql), der in GetSomeData aufgerufen wurde, nicht aktiv war und der Client tatsächlich etwas mit diesen Informationen machen kann (z. B. eine entsprechende Nachricht anzeigen) - wollen Sie nicht ausblenden diese Information - einen Fehler zu werfen ist informativer.
Ein anderes Beispiel - wenn parameter null ist und das eine Ausnahme verursacht .. (obwohl du wahrscheinlich schon früher im Code darauf geachtet haben solltest. Aber du bekommst die Idee) - sollte eine entsprechende (informative) Exception werfen.

Wenn es dem Client überhaupt nicht interessiert, warum er keine Daten zurückbekommen hat, können Sie null zurückgeben, er wird den Fehlertext sowieso ignorieren und sein Code wird gleich aussehen.

    
Oren A 25.10.2010 21:35
quelle
0

Die allgemeine Praxis bei der Behandlung von Ausnahmen ist, wenn die Sequenz des Flusses unter normalen Umständen erwartet wird, wo die Sequenz aufgrund der Nichtverfügbarkeit von Ressourcen oder der erwarteten Eingabe nicht abgeschlossen werden konnte.

In Ihrem Fall müssen Sie noch entscheiden, wie Ihr clientseitiger Code auf Null oder Ausnahme reagieren soll.

    
user90150 19.10.2010 15:40
quelle
0

Wie wäre es mit einem Delegierten, der aufgerufen wird, wenn etwas Schlimmes passiert? Der Delegat könnte eine Ausnahme auslösen, wenn dies von außen gewünscht wird, oder die Funktion null zurückgeben lassen (wenn der äußere Code dies überprüft) oder möglicherweise eine andere Aktion ausführen. Abhängig von den Informationen, die an den Delegaten übergeben werden, ist es möglicherweise in der Lage, mit Problemzuständen so umzugehen, dass die Verarbeitung fortgesetzt werden kann (z. B. kann der Delegierte ein "Wiederholungs" -Flag die ersten Male, wenn er aufgerufen wird, setzen, falls das Netzwerk flockig ist Verbindungen werden erwartet). Es kann auch möglich sein, dass ein Delegierter Informationen protokolliert, die zu dem Zeitpunkt nicht existieren würden, an dem eine Ausnahme abgefangen werden könnte.

PS - Es ist wahrscheinlich am besten, eine benutzerdefinierte Klasse an den delegierten Fehler zu übergeben. Dadurch können zukünftige Versionen der Methode zusätzliche Informationen für den Delegaten bereitstellen, ohne dass Implementierungen, die einfachere Informationen erwarten, durchbrochen werden.

    
supercat 25.10.2010 21:06
quelle
0

Ausnahmen werden im selben Prozessbereich empfohlen. In den Prozessen wird nur durch Information ein Erfolg / Misserfolg bewertet.

    
zerodin 27.10.2010 20:16
quelle
0
  • Da Sie der Client für Ihren Webservice sind, können Sie die Ausnahme auf der Serviceebene protokollieren und null an den Client zurückgeben. Der Client sollte dennoch wissen, ob CallGetSomeData null zurückgegeben hat, weil a) Daten nicht verfügbar sind oder b) Es gibt eine Datenbankausnahme, da die Tabelle gesperrt ist. Daher ist es immer gut zu wissen, was den Fehler verursacht hat, um das Reporting auf der Client-Seite zu vereinfachen. Sie sollten einen Fehlercode und eine Beschreibung als Teil Ihrer Nachricht haben.
  • Wenn Sie Ihren Webservice nicht konsumieren, sollten Sie aus den gleichen Gründen, wie oben erwähnt, auf jeden Fall eine Exception auslösen, der Client sollte wissen, was passiert ist, und es kann entscheiden, was damit zu tun ist.
anivas 29.10.2010 20:37
quelle