Frage

Welches ist der beste Ort ist, um die Ausnahmen zu behandeln? BLL, DAL oder PL?

Soll ich erlauben die Methoden in der DAL und BLL die Ausnahmen auf die Kette zu werfen und lassen Sie die PL mit ihnen umgehen? oder soll ich sie an der BLL umgehen?

z

Wenn ich eine Methode in meinem DAL habe, dass Fragen „ExecuteNonQuery“ und einige Datensätze aktualisiert, und aufgrund eines oder mehrere Grund, 0 Zeilen betroffen sind. Nun, wie soll ich meine PL lassen, dass wissen, ob eine Ausnahme passiert ist oder es gab wirklich keine Zeilen auf den Zustand abgestimmt. Soll ich „Try-Catch“ in meinem PL-Code verwenden und lassen Sie es durch eine Ausnahme wissen, oder soll ich die Ausnahme bei DAL behandeln und einigen speziellen Code zurück wie (-1), um den PL differenzierbare zwischen der (Ausnahme) zu lassen und (keine Reihen angepaßten Zustand dh Null betroffenen Zeilen)?

War es hilfreich?

Lösung

Es macht keinen Sinn, eine Ausnahme zu lassen, die die PL in der DAL sprudeln geworfen wird - wie ist der Benutzer sollte reagieren, wenn die Datenbankverbindung kann nicht hergestellt werden

Fang und Griff Ausnahmen früh, , wenn Sie können mit ihnen umgehen. Nicht nur schlucken sie ohne einen Hinweis oder eine Log-Nachricht ausgibt -. Dies zu erheblichen Schwierigkeiten und Fehlern führen wird, die schwer zu verfolgen

Andere Tipps

Dies ist ein riesiges Thema mit vielen unnötigen Kontroversen (Menschen mit lauter Stimme schlecht info geben!) Wenn Sie bereit sind, das zu lösen ist, folgen s1mm0t Rat, ist es meist angenehm.

Allerdings, wenn Sie eine Ein-Wort-Antwort, legte sie in der PL. Ernst. Wenn Sie weg erhalten können damit Ihre Fehlerbehandlung in einem globalen Exception-Handler setzen (sollten alle Fehler protokollieren und einen Code geben Sie das Protokoll in der Produktion aus Sicherheitsgründen nachschlagen (va wenn Web), aber geben die Einzelheiten während der Entwicklung zurück für Geschwindigkeitsgründen).

Edit: (Klärung) Sie haben überall mit einigen Fehlern beschäftigen - aber dies ist keine 'jede Funktion' Norm. Die meiste Zeit sie Blase bis zum PL lassen und .NET die globale Fehler mit Ihrem eigenen Code behandeln: log die vollständige Call-Stack von dort über eine gemeinsame Routine, die von allen drei Schichten über Event-Handler (siehe EDIT am Ende der Nachricht zugänglich ist ). Das heißt, Sie nicht haben try / catch durch alle bestreut Code; gerade Abschnitte, die Sie erwarten und Fehler und kann es direkt dort behandeln, oder, nicht-kritische Abschnitte, mit dem Sie den Fehler protokollieren und dem Benutzer nicht zur Verfügung Funktionalität informieren (dies ist noch seltener und für super-zuverlässig / kritische Programme)

Abgesehen davon, wenn sie mit begrenzten Ressourcenelementen arbeiten, verwende ich oft den ‚Verwendung‘ Keyword oder try / finally / Ende versuchen, ohne Haken. für Multithreading-lock / Mutex / Wiedereintritt Prävention Fahnen / etc. Darüber hinaus müssen Sie versuchen, / endlich in allen Fällen so Ihr Programm noch funktioniert (insbesondere Stateful-Anwendungen).

Wenn Sie Ausnahmen nicht ordnungsgemäß verwenden (beispielsweise mit nicht-Fehler umgehen, wenn Sie die IF-Anweisung verwendet werden soll, oder es sich um eine zweifelhafte Operation Überprüfung funktioniert, bevor Sie es versuchen), wird diese Philosophie auseinander mehr fallen.

Eine Randnotiz, in Thick-Client-Apps vor allem, wenn die Möglichkeit besteht, erhebliche Mengen an zu verlieren oder die Eingabe des Anwenders, können Sie besser mit mehr try / Fänge, wo Sie versuchen, die Daten zu speichern (markiert als nicht-yet- gültig natürlich).

EDIT: ein weitere Notwendigkeit für mindestens den mit der Anmeldung Routine in der PL - dies anders funktionieren wird in Abhängigkeit von der Plattform. Eine App wir auf Aktien der BLL / DAL mit 3 PL-Versionen arbeiten: eine ASP.Net-Version, eine WinForms-Version und eine Konsole app Batch-Modus Regressionstests Version. Die Protokollfunktion, die aufgerufen wird, ist tatsächlich in der BLL (die DAL wirft nur Fehler oder vollständig behandelt jeden es wird oder wieder wirft sie). Allerdings wirft dies ein Ereignis, das von der PL behandelt wird; im Web setzt es es in dem Log-Server und macht Web-Stil Fehlermeldung Display (freundliche Mitteilung für die Produktion); in WinForms erscheint ein spezielles Meldefenster mit Tech-Support-info, etc. und protokolliert den Fehler hinter den Kulissen (Entwickler etwas ‚Geheimnis‘ tun können, die vollständigen Informationen zu sehen). Und natürlich in der Testversion ist es ein viel einfacheres Verfahren aber anders als gut.
Nicht sicher, wie ich das in der BLL getan hätte, außer für das Bestehen eines Parameters ‚auf welcher Plattform,‘ aber da es nicht Winforms oder ASP-Bibliotheken enthalten, dass die Protokollierung hängt davon ab, dass immer noch ein Trick sein würde.

Die kurze Antwort ist es hängt!

Sie sollten immer nur eine Ausnahme behandeln, wenn Sie etwas Nützliches damit machen können. Die ‚etwas Nützliches‘ hängt wieder auf, was Sie tun. Sie sollten die Details der Ausnahme loggt sein, obwohl dies nicht wirklich Handhabung und Sie sollten die Ausnahme erneut werfen nach der Anmeldung in den meisten Fällen wirklich. Vielleicht mögen Sie die Ausnahme in einer anderen (möglicherweise benutzerdefinierten) Ausnahme, um wickeln, um weitere Informationen zu der Ausnahme hinzufügen. Wie @mbeckish berührt, können Sie von der Ausnahme versuchen, den Vorgang wiederholt zum Beispiel zu erholen - Sie sollten vorsichtig sein, immer aber nicht zu wiederholen. Schließlich (entschuldigen Sie das Wortspiel) Sie einen finally-Block verwenden, sollten alle Ressourcen zu bereinigen, wie eine offene DB-Verbindung. Was Sie wählen, mit Ausnahme zu tun beeinflussen, wo man es handhaben. Es ist wahrscheinlich, dass es nicht viel nützlicher Dinge ist, die mit vielen Ausnahmen anderes als zu Bericht an den Benutzer durchgeführt werden können, dass ein Fehler in dem Fall aufgetreten ist, wäre es mehr als akzeptabel sein, die Ausnahme in der UI-Ebene zu behandeln und melden Sie das Problem an den Benutzer (Sie sollten wahrscheinlich die Ausnahme log auch, weiter unten Ihre Schichten).

Wenn Ausnahmen selbst zu werfen, sollten Sie immer nur Ausnahmen in ‚exceptional'circumstances werfen, da es einen großen Overhead Ausnahmen zu werfen. In Ihrem Beispiel vorschlagen, Sie werfen eine Ausnahme denken können, wenn keine Datensätze von Ihrem Betrieb aktualisiert werden. Ist das wirklich außergewöhnlich? Eine bessere Sache in dieser Situation zu tun wäre, die Anzahl der Datensätze aktualisiert zurückzukehren - dies immer noch ein Fehler sein kann, dass der Bedarf an den Benutzer gemeldet wird, ist aber nicht außergewöhnlich wie der Befehl scheitern, weil die connecction an die DB hat unten gegangen.

Diese ist ein vernünftiger Artikel auf Ausnahmebehandlung am besten Praktiken.

Die Schicht, die weiß, was zu Satz Dinge zu tun, sollte richtig sein die Schicht, die Griffe die Ausnahme. Zum Beispiel, wenn Sie Deadlock Fehler zu behandeln durch erneuten Versuch der Abfrage eine bestimmte Anzahl von Malen entscheiden, dann könnten Sie das in Ihre DAL bauen. Wenn es weiterhin fehlschlägt, dann mögen Sie vielleicht die Ausnahme Blase bis zur nächsten Schicht lassen, die dann entscheiden können, ob sie weiß, wie man richtig diese Ausnahme zu behandeln.

Alle Schichten in Ihrer Anwendung sollten Ausnahmen gracefullly verwalten. Das ist Know als Querschnitt corncern, weil es in allen Ihren Schichten erscheint. Ich glaube, dass ein Framework wie Enterprise-Exception-Block mit der Einheit, werden Sie insgesamt mit einem besseren Code am Ende. Werfen Sie einen Blick auf dieses Thema

http://msdn.microsoft. com / en-us / library / ff664698 (v = PandP.50) aspx

Es wird irgendwann nehmen, es zu meistern, aber es gibt viele Beispiele und Screencasts um dort.

Wie Ausnahmen zu behandeln, hängt von technischen und geschäftlichen Anforderungen. Für komplexe oder sehr wichtige Datenbank-Updates Ich schließe aus params, die eine kleine Liste der bekannten Fehler Sicherung auf dem DL passieren. Auf diese Weise bekannte Fehlerszenarien können programmatisch in einigen Fällen gelöst werden. In anderen Fällen muss der Fehler protokolliert werden und der Benutzer sollte ein Fehler gemeldet werden.

Ich mache eine Praxis einen Menschen von Fehlern zu benachrichtigen. Sicher, die Protokollierung wird uns detaillierte Informationen, aber es ist kein Ersatz für die Reaktionszeit eines Menschen. Nicht nur das, aber warum Kraft Entwickler Systemprotokolle zu beobachten, um zu sehen, wenn die Dinge nach Süden gehen? Sprechen Sie über die unnötig Kosten.

Wenn Sie Zeit mögliche Fehler / Ausnahmen zu definieren und sie programmatisch lösen, dann mit allen Mitteln tun. Viele Male Fehler / Ausnahmen sind unerwartet. Deshalb ist es wichtig, für diese unerwartete vorbereitet zu werden und welchen besseren Weg, das zu tun, als einen Menschen beteiligt sind.

Insgesamt sollte man in der Defensive sein, wenn Ausnahmebehandlung planen. Programme wachsen oder sie sterben. Ein Teil des Erwachsen ist Bugs einzuführen. Also nicht drehen die Räder zu versuchen, sie alle zu töten.

Die Frage an Sie ist, wo die Ausnahme relevant? Wenn es sich um eine Datenzugriffsausnahme ist es sollte in der DAL gefangen werden. Wenn es sich um eine logische Ausnahme ist es sollte in der BLL gefangen werden. Wenn es eine Präsentation Ausnahme dann in der PL.

Zum Beispiel, wenn Ihre DAL wirft eine Ausnahme eine Null oder einen falschen zurückgeben sollte oder was auch immer der Fall zu Ihrem BLL sein kann. Ihre BLL sollte wissen, was zu tun ist, wenn die DAL einen Nullwert zurückgibt, vielleicht ist es passiert es richtig durch, vielleicht versucht sie eine andere Funktion aufrufen, etc. Das gleiche mit Ihrem PL geht, wenn der BLL läuft durch eine Null von der DAL oder gibt etwas Bestimmtes eigene dann sollte die Präsentationsschicht in der Lage sein, den End-Benutzer zu benachrichtigen, dass es ein Problem war.

Natürlich werden Sie nicht die ausführliche Ausnahmemeldungen bekommen, aber das ist eine gute Sache so weit wie Ihre Nutzer betroffen sind. Sie sollten eine flexible Protokollierungssystem müssen diese Ausnahmen abfangen und melden Sie diese in eine Datenbank oder einer ip: port oder was auch immer Sie sich entscheiden.

Im Wesentlichen müssen Sie in Bezug auf Trennung von Bedenken wenn die Sorge eine Daten Problem oder eine logische Ausgabe es entsprechend behandelt werden soll.

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