Frage

Ich habe ein Gespräch mit einem Kollegen über, wenn Fehler zu werfen, und wenn keine Fehler in einem WCF-Dienst zu werfen.

Eine Meinung ist, dass wir nur Fehler werfen, wenn der Service-Betrieb nicht seine Arbeit zu einem gewissen Fehler aufgrund tun könnte; und etwas kann, weil es in einem ungültigen Zustand sein. Also, einige Beispiele:

  • ValidateMember (string name, string Passwort, string Land) -> würde einen Fehler auslösen, wenn die obligatorischen Parameter nicht übergeben werden, da die Validierung selbst konnte nicht ausgeführt werden; -> würde Fehler auslösen, wenn einige interne Fehler aufgetreten, wie Datenbank war nach unten -> würde einen Status Vertrag in allen anderen Fällen zurückkehren Länge, die das Ergebnis der Validierung (MemberValidated, Wrongpassword, MemberNotKnown, ...)

  • GetMember (int MemberID) -> würde nur Fehler werfen, wenn etwas nach unten, in allen anderen Fällen wäre es das Element oder null zurück, wenn nicht gefunden

Die andere Meinung ist, dass wir auch Fehler werfen sollen, wenn GetMember das Mitglied nicht finden, oder im Fall von ValidateMember das Passwort falsch ist.

Was denken Sie?

War es hilfreich?

Lösung

Meine Meinung zu diesem ...

Es gibt drei Ursachen des Scheiterns:

  1. Der Service-Code eine Ausnahme ausgelöst hat, z.B. Datenbankfehler, logische Fehler in Ihrem Code. Das ist deine Schuld.
  2. Die Code-Client fehlgeschlagen Ihren Dienst zu verwenden, ordnungsgemäß entsprechend den Unterlagen, z.B. es hat keinen erforderlichen Flagwert gesetzt, es scheiterte in einer ID zu übergeben. Dies ist der Client-Software-Entwickler schuld.
  3. Der Benutzer Ende in etwas getippt albern auf dem Bildschirm, z fehlt das Geburtsdatum, die negativen Gehalt. Dies ist der Fehler des Endbenutzers.

Es ist an Ihnen, wie Sie tatsächlich Fehler Verträge zu jeder Fehlerursache Karte wählen. Zum Beispiel haben wir diese:

  • Für Ursachen 1 und 2, alle Client-Code muss wissen, ist, dass der Dienst nicht. Wir definieren einen sehr einfachen „fataler Fehler“ Fehler Vertrag, der nur eine eindeutige Fehler-ID enthält. Die vollständigen Details des Fehlers auf dem Server protokolliert.
  • Bei Ursache 3 sind die Endbenutzer Bedürfnisse genau wissen, was er / sie falsch gemacht haben. Wir definieren einen „Validierungsfehler“ Fehler Vertrag eine Sammlung von kurzen Fehlermeldungen für die Client-Code-Anzeige auf dem Bildschirm enthält.

Wir leihen den Microsoft EntLib Klasse für Ursache 3, und verwenden Ausnahme abschirmenden Griff 1 und 2 bewirkt deklarativ. Es macht für sehr einfachen Code.

Zur Klarstellung:

Wir behandeln die drei Ursachen wie diese in den Service:

  1. Eine unerwartete Ausnahme ist in dem Service-Code geworfen. Wir fangen es auf der obersten Ebene (tatsächlich Ausnahme Abschirmung Fänge, aber das Prinzip ist das gleiche). Melden Sie weitere Informationen, dann eine FaultException<ServiceFault> an den Client werfen nur die Fehler-ID enthält.
  2. Wir validieren die Dateneingabe und bewusst eine Ausnahme werfen. Es ist normalerweise ein ArgumentException, aber jede geeignete Art tun würde. Sobald es geworfen wird, wird sie behandelt in genau der gleichen Weise wie bei (1), weil wir wollen, dass es gleich dem Client erscheinen.
  3. Wir validieren die Dateneingabe und bewusst eine Ausnahme werfen. Dieses Mal ist es ein FaultException<ValidationFault>. Wir Ausnahme Abschirmung konfigurieren, dass diese eine durch un-gewickelt passieren, so dass es auf dem Client als FaultException<ValidationFault> nicht FaultException<ServiceFault> angezeigt wird.

Endergebnis:

  • Keine catch-Blöcke überhaupt in dem Dienst (schöner sauberer Code).
  • Client hat nur FaultException<ValidationFault> zu fangen, wenn es will, Nachrichten an den Benutzer angezeigt werden soll. Alle andere Ausnahmetypen einschließlich FaultException<ServiceFault> werden behandelt durch den globale Fehlerbehandlung als fataler Fehler des Kunden, da ein schwerwiegender Fehler in dem Dienst bedeutet in der Regel einen fatalen Fehler im Client als auch.

Andere Tipps

Es ist es eine gemeinsame, Routine Versagen, dann wirft ein Fehler ist ein Fehler. Die Software soll geschrieben werden Routine Artikel zu handhaben, wie das falsche Passwort eingeben. Fehlerverarbeitung ist für außergewöhnliche Versagen, die nicht Teil des Programms der normalen Auslegung berücksichtigt.

Zum Beispiel, wenn Ihr Programm mit der Idee geschrieben wurde, dass es immer Zugriff auf eine Datenbank hat, und die Datenbank kann nicht zugegriffen werden, das ist ein Problem, bei dem die „fix“ ist auch außerhalb der Grenzen Ihrer Software. Ein Fehler sollte geworfen werden.

Fehlerverarbeitung verwendet unterschiedliche logische fließt durch die Struktur der Programmiersprache, und es nur verwenden, wenn Sie „links“ die normale Verarbeitung des Programmierproblems haben, werden Sie Ihre Lösung nutzt die Funktion der Programmiersprache machen in eine Art und Weise, die natürlichen scheint.

Ich glaube, es ist eine gute Übung, um getrennte Fehlerbehandlung und Fehlerbehandlung. Jeder Fehlerfall sollte von Ihrem Programm behandelt werden - Fehlerbehandlung ist für außergewöhnliche Bedingungen vorbehalten. Als Leitfaden für die Trennung der beiden ich es nützlich, wenn man bedenkt, solche Fälle zu erinnern, dass es nur drei Arten von Fehlern und nur eine Art von Fehler (wenn Daten und Nachrichten Handhabung). Die Fehlertypen sind im Zusammenhang mit verschiedenen Arten von Validierung:

  1. Nachrichtenvalidierung - Sie aus dem Nachrichteninhalt feststellen können, dass die Daten gültig oder ungültig sind.

    . Beispiel: Inhalt, der dazu bestimmt ist, ein Geburtsdatum zu sein - Sie aus den Daten sagen können, ob es gültig ist oder nicht

  2. Validierung Kontext - man kann nur den Inhalt bestimmen ungültig ist durch Bezugnahme auf die Nachricht mit dem Systemzustand kombiniert.

    . Beispiel: ein gültiges Datum ein Unternehmen des Beitritts ist früher als jene Personen Geburtsdatum

  3. Lügen auf das System - kann man nur feststellen, dass eine Nachricht in Fehler war, wenn eine spätere Meldung wirft eine Anomalie auf.

    Beispiel: Gültig Geburtsdatum gespeichert und Inspektion der Geburtsurkunde zeigt Person dies falsch. Korrektur von Lügen an dem System erfordert in der Regel Aktion außerhalb des Systems, zum Beispiel Heilmittel rechtliche oder disziplinarische Berufung.

Ihr System muss mit allen Klassen der Fehler umgehen -. Obwohl bei drei dieser auf der Ausstellung eine Warnung beschränkt werden kann

Störungen (Ausnahmen) hingegen haben nur eine Ursache - Beschädigung von Daten (die Datenkürzung beinhaltet). Beispiel: Validierung Parameter werden nicht weitergegeben.

Hier ist der entsprechende Mechanismus ist Fehler oder Ausnahmebehandlung - grundsätzlich Gabe aus dem Problem zu einem anderen Teil des Systems, das der Umgang mit ihr fähig ist (weshalb sollte es eine ultimative Ziel für nicht behandelte Fehler sein)

In den alten Tagen haben wir eine Regel haben, dass Ausnahmen nur für außergewöhnliche und unerwartete Dinge waren. Einer der Gründe, warum Sie nicht, sie wollten war verwenden sehr, dass sie „Kosten“ eine Menge Rechenleistung.

Aber wenn Sie Ausnahmen verwenden Sie die Menge an Code reduzieren, keine Notwendigkeit für eine Menge, wenn else-Anweisungen, sondern nur die Ausnahme Blase nachgelassen.

Es hängt von Ihrem Projekt. Das Wichtigste ist, dass es ein Projekt Standard und jeder tut es auf die gleiche Weise.

Meine Meinung ist, dass Ausnahmen / Fehler geworfen werden sollten, wann immer, was die Methode sollte kann nicht erreicht werden. So Logik Validierung soll nie außer Ausnahme auslösen, wenn die Validierung nicht (dh aus technischen Gründen) gemacht werden kann, aber niemals nur, weil die Daten (in diesem Fall nicht gültig sind, wird es Validierungscodes / messages oder irgendetwas helfen, den Aufrufer die korrigieren Daten).

Nun ist der GetMember Fall ist interessant, weil es alles über semantische ist. Der Name der Methode lassen vermuten, dass ein Element durch Hindurchleiten eines ID abgerufen werden (vergleiche mit einem TryGetMember Verfahren zur exemple). Natürlich sollte das Verfahren nicht die gleiche Ausnahme auslösen, wenn die ID nirgendwo zu finden ist oder wenn die Datenbank nicht reagiert, sondern eine falsche ID dieser Methode übergeben ist wahrscheinlich das Zeichen, dass etwas vor diesem Anruf irgendwo falsch geht. Es sei denn, der Benutzer kann direkt ein Mitglied-ID innerhalb der Schnittstelle eingeben, in welchem ??Fall eine Validierung aufgetreten sollte vor dem Aufruf der Methode.

höre ich viel über die Performance-Problem. Ich habe gerade einen einfachen Test mit C # und trow / catch 1000 Ausnahmen gemacht. Die Zeit, die ist 23ms für 1K Exeptions. Das ist 23µ pro Ausnahme. Ich denke, die Leistung ist nicht mehr das erste Argument hier außer wenn Sie planen, mehr als 2000 Ausnahme pro Sekunde zu erhöhen, in dem Fall, dass Sie eine 5% Leistung nach unten haben, was ich anfangen kann unter Berücksichtigung.

Meine bescheidene Meinung ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top