Wir bauen einen Webservice (SOAP, .Net) auf, der mit (meistens) nativen Clients (Windows, C ++) kommunizieren würde, und wir fragen uns, wie Fehler am besten an den Client kommuniziert werden können (z. B. SomethingBadHappened wie Login-Service nicht verfügbar) oder so etwas wie Benutzer nicht gefunden) und nicht in der Lage waren, sich zwischen dem Auslösen einer Ausnahme für den Client oder der Verwendung eines Fehlercodemodells zu entscheiden.
Was würden Sie bei der Behandlung auf der Client-Seite bevorzugen: einen Fehlercode erhalten oder eine ServerFault-Ausnahme behandeln, die den Grund für den Fehler enthält?
1) Warum wir denken Ausnahme: Weil es würde Server - seitigen Code viel einheitlichere machen
2) Warum wir Fehlercodes denken: Weil wir denken , es sinnvoller , von der Client - Seite Perspektive macht.
Wenn 2) wirklich wahr ist, würden wir wahrscheinlich Fehlercodes als Ausnahmen suchen wollen? Ist das hier der Fall?
Würde sich die Antwort auch ändern, wenn wir mit verwalteten Clients anstelle von systemeigenen Clients sprechen würden?
quelle
Antworten:
SOAP hat ein Konzept von Fehlern , können Sie eine Ausnahme auf einen Fehler auf der Serverseite und auf dem Client - Proxy konvertieren die Fehler erneut umgebaute zurück auf eine Ausnahme sein. Dies funktioniert bemerkenswert gut in WCF- und Java-Metro-Stacks und kann native C ++ - Clients nicht kommentieren.
In Bezug auf SOA Best Practice definieren Sie einen allgemeinen Fehler und einige spezifische Fehler nur dann, wenn der Client eine bestimmte Art von Fehler unterschiedlich behandeln muss. Senden Sie niemals einen Ausnahmestapel-Trace an den Client in der Produktionsbereitstellung. Dies liegt daran, dass der Server-Trace theoretisch für den Client und auch aus Sicherheitsgründen keine Bedeutung hat. Protokollieren Sie den vollständigen Fehler und die Stapelverfolgung auf dem Server und senden Sie eine eindeutige Referenz zum Protokoll des Fehlers. In WCF verwende ich den Microsoft Exception Handling-Block aus der Enterprise Library, um eine Guid zu generieren und auch eine Ausnahme in einen SOAP-Fehler zu konvertieren.
Überprüfen Sie die Anleitungen unter Microsoft Patterns and Practices .
quelle
Ich habe kürzlich einen Webdienst mit den Java 6-Bibliotheken erstellt, der eine Ausnahme an den Aufrufer zurückmeldet (ich habe nicht untersucht, wie dies automatisch erfolgt).
Die Möglichkeit, dass der Client dem Entwickler eine Stapelablaufverfolgung im Fehlerbericht bereitstellt, war sehr nützlich (im Gegensatz dazu, einen ungefähren Zeitstempel zu erhalten und diesen dann in Ihren Protokollen nachzuschlagen, wenn Sie ihn gerade protokollieren).
Verwenden Sie also aus Entwicklersicht Ausnahmen.
quelle
Wenn es sich um einen Webdienst handelt, können Sie nicht genau festlegen, dass der Server eine Ausnahme auslöst, die vom Client abgefangen wird. An der Schnittstelle muss Ihr Server im Grunde eine Art Fehlercode zurückgeben, auch wenn dies eine Zeichenfolge ist, die besagt
An exception occurred. Type %s, message %s, stack trace %s
.Auf der Clientseite können Sie Ihren Antwortlesecode veranlassen, die Antwort zu überprüfen, um festzustellen, ob sie einen Fehler enthält, und auf der Clientseite eine Ausnahme auslösen. Das ist eine sehr gute Möglichkeit, zumindest in Sprachen mit guter Ausnahmebehandlung. C ++ hat jedoch keine gute Ausnahmebehandlung, und es ist eine gute Idee, sich so weit wie möglich von C ++ - Ausnahmen zu entfernen. Wenn Sie keine bessere Sprache verwenden können, halten Sie sich einfach an die Fehlercodes.
quelle