Ausnahmen oder Fehlercodes

12

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?

Amit Wadhwa
quelle
Nur um ein bisschen Klarheit zu schaffen: a) Ich suche hier nach Best Practices und Erfahrungen auf der Client-Seite (da der Client viel komplizierter ist und wir lieber Sachen auf der Server-Seite behandeln, wenn wir den Client-Code einfacher halten können). B) Der Client enthält viel Legacy-Code und möglicherweise können wir C ++ - Ausnahmen verwenden oder auch nicht.
Amit Wadhwa,
Dies kann hilfreich sein
Gulshan

Antworten:

8

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 .

softveda
quelle
Danke, das hört sich gut an. Können Sie mir dort auf der Seite einen genaueren Link geben?
Amit Wadhwa
Und was ist mit Fehlern auf Unternehmensebene wie UserNotFound usw., sollten diese ebenfalls als Ausnahmen behandelt werden
Amit Wadhwa,
In früheren Projekten haben wir niemals Ausnahmen in Code oder Fehler in SOAP verwendet, um legitime / erwartete Fehlermodi zu kommunizieren. Wir haben Fehlercodes verwendet und sie dem Kunden überlassen, um zu entscheiden, was mit ihnen geschehen soll. Benutzer nicht gefunden ist nicht wirklich ein Fehler / eine Ausnahme, dies sollte wahrscheinlich ein Statuscode sein.
MrLane
4

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
1
Ich bin damit einverstanden, dass dies in Hundefutter und Beta nützlich sein könnte, aber möchten Sie wirklich Stapelspuren in Ereignisprotokollen oder Protokolldateien in der realen Nutzung ausspucken (und natürlich mehr Details über den Dienst preisgeben, als Sie benötigen / möchten) )
Amit Wadhwa
2
@Amit, vertraue mir in diesem Punkt: Wenn du in der Produktion auf eine Situation stößt, in der es einen Stack-Trace gibt, WILLST du den Stack-Trace!
1
Was ist der Vorteil von Stack-Trace auf der Client-Seite? Wir werden definitiv alle Ausnahmen auf der Server-Seite protokollieren, bevor wir sie an den Client weiterleiten.
Amit Wadhwa
Und was ist mit Fehlern auf Unternehmensebene wie UserNotFound usw., sollten diese ebenfalls als Ausnahmen behandelt werden
Amit Wadhwa,
-2

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.

Mason Wheeler
quelle
Ich schätze, die nicht abgefangene Ausnahme würde als ServerFault an den Client gehen
Amit Wadhwa,
3
An C ++ - oder C ++ - Ausnahmen ist nichts auszusetzen. Es gibt viele Gründe, eine andere Sprache als C ++ für bestimmte Projekte zu verwenden, aber die Ausnahmebehandlung ist keine davon.
KeithB
Nicht nur, dass dies gegen bewährte Sicherheitsmethoden verstößt: Was genau sollte der Client mit dem Stack-Trace Ihres Servers tun? Drucken Sie es aus und senden Sie es an Sie? Als E-Mail senden? Für Schmierpapier verwenden?
JensG
@JensG: Wenn es sich um einen Webdienst und nicht um eine Website handelt , sollte der Client so professionell sein, dass er Ihnen eine E-Mail mit einem Fehlerbericht sendet.
Mason Wheeler