Frage

Ich habe einen WCF svc in eine Service Layer getrennt, Business-Logik-Schicht und Datenzugriffsschicht.

Als mein DAL eine Ausnahme trifft, soll ich es dort fangen oder lassen Sie es Blase zurück zum Service Layer up? Und warum?

Bitte ignorieren jede Client-Beteiligung für dieses Szenario, ich bin nur mit Anmeldung, die Ausnahmen von der WCF svc betroffen.

War es hilfreich?

Lösung

Es hängt auch davon ab, wie Sie Ihre Lösung Architecting. Zum Beispiel sind gemeint, wenn die DAL und BLL Schichten völlig unabhängige Komponenten sein, dann können sie machen keine Annahmen darüber, wer sie anruft. Als solche sollten sie beide fangen Ausnahmen auf der Komponente Grenze, melden Sie sich diese Ausnahmen, dann erlauben die Ausnahme zu propagieren. Sie möchten die allgemeine Ausnahme in einer Schicht-spezifische Ausnahme wickeln:

catch (Exception ex)
{
    Logger.Log(ex);
    throw new DalException("Unhandled exception in DAL", ex);
}

Wenn Sie wissen diese werden nur als Teil Ihrer gesamten Anwendung verwendet werden, dann können Sie die Protokollierung auf die äußerste Schicht verschieben - die Schicht, die, wenn sie nicht die Ausnahme nicht auffängt, die Ausnahme wird nicht geloggt werden.

Andere Tipps

Es ist ein Begriff für die - Ausnahme Abschirmung. Grundsätzlich sollten Sie SYSTEM Ausnahmen Reise zu einer höheren Ebene verhindern, da dies eine atacker einen Blick auf Ihre Systemarchitektur geben könnte. WCF Ausnahme Abschirmung kann Ausnahmen von bestimmten Art fangen und ersetzt sie durch Ausnahmen von einer anderen Art. Zum Beispiel könnte es Stackoverflow Ausnahme und ersetzen Sie es mit Ihrem eigenen Systemexception fangen. Wenn Sie Enterprise Library verwenden können Sie auch konfigurieren, dass diese Ausnahmen protokollieren, wenn sie ersetzt werden

Mit dem Exception Handling-Block in Enterprise Library 3.0

Ich denke, es hängt davon ab, wie der Dienst verbraucht wird und das (wenn jemand) Sie wollen darauf aufmerksam gemacht, wenn eine Ausnahme auftritt.

Zum Beispiel, wenn Sie eine missionskritische interne Geschäfts-Anwendung entwickeln, können Sie die Details der Ausnahme zu sprudeln durch die Dienstschicht an das Benutzer-Interface mögen, dass nutzt die Anwendung, so dass sie Endbenutzer einen Kontakt Entwickler schnell das Problem gelöst bekommen.

Doch lassen Sie uns sagen, dass Ihre Service von einer öffentlichen Webseite verbraucht wird. Sie wollen wahrscheinlich immer noch die Service-Layer, den Fehler in irgendeiner Weise zu fangen, aber Sie können wählen, minimale Informationen zu den Endkunden weitergeben, eine generische Fehlermeldung an den Endverbraucher liefern, und schreiben Sie die Details der Ausnahme in ein Fehlerprotokoll für Entwickler zu überprüfen.

Am Ende habe ich immer noch denken, dass Sie die Ausnahme Blase bis zur Service-Layer wollen, sondern wie man die Ausnahme behandeln und entscheiden, welche Informationen weitergeben zu den Endkunden zu Ihnen auf.

Normalerweise verwende ich einen allgemeinen Fehler-Handler (System.ServiceModel.Dispatcher.IErrorHandler Implementierung), die auf Web-Service durch eine ServiceBehavior in der Konfigurationsdatei verbunden ist.

Die IErrorHandler.ProvideFault Methode fängt Ausnahmen von dem Dienst geworfen und:

  • Logs sie;

  • Pässe FaultExceptions durch, wie sie ist;

  • Wandelt "Geschäft" Ausnahmen (zum Beispiel Geschäftsregelverletzungen) geworfen durch die BLL FaultExceptions mit einem Fehlercode "Absender / Client";

  • Wandelt technische Ausnahmen (zum Beispiel durch die DAL geworfen) zu FaultExceptions mit einem Fehlercode "Empfänger / Server".

Damit wird der Service-Code selbst enthält nur die Business-Code und benötigt keine Ausnahmen zu fangen.

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