Wie wird die Verwendung der allgemeinen Ausnahme umgestaltet?

8

Unser Code fängt die allgemeine Ausnahme überall ein.

Normalerweise schreibt es den Fehler in eine Protokolltabelle in der Datenbank und zeigt dem Benutzer eine MessageBox an, um zu sagen, dass die angeforderte Operation fehlgeschlagen ist. Wenn eine Datenbankinteraktion stattfindet, wird die Transaktion zurückgesetzt.

Ich habe eine Business-Logik-Schicht und eine Datenzugriffsschicht eingeführt, um einen Teil der Logik zu entschlüsseln. In der Datenzugriffsschicht habe ich gewählt, nichts einzufangen, und ich werfe auch ArgumentNullExceptions und ArgumentOutOfRangeExceptions, so dass die Nachricht, die den Stack weitergegeben wird, nicht direkt aus der Datenbank kommt.

In der Business-Logik-Ebene habe ich versucht, zu fangen. In der Fange rolle ich die Transaktion zurück, tue das Protokollieren und erneut ausführen.

In der Präsentationsebene gibt es einen weiteren try catch, der eine MessageBox anzeigt.

Ich denke jetzt darüber nach, eine DataException und eine ArgumentException anstelle einer Exception abzufangen, bei der ich weiß, dass der Code nur auf eine Datenbank zugreift.

Wenn der Code auf einen Webdienst zugreift, dachte ich, ich würde meine eigene "WebServiceException" erstellen, die in der Datenzugriffsebene erstellt wird, sobald eine HttpException, WebException oder SoapException ausgelöst wird.

Also jetzt, im Allgemeinen werde ich 2 oder 3 Ausnahmen fangen, wo ich derzeit nur die allgemeine Ausnahme erwische, und ich denke, das scheint mir OK. Will jemand wieder Ausnahmen nach oben übertragen, um die Nachricht bis zur Präsentationsebene zu übertragen?

Ich denke, ich sollte wahrscheinlich einen try catch zu Main () hinzufügen, das Exception abfängt, versucht, es zu protokollieren, zeigt eine Meldung "Anwendung hat einen Fehler festgestellt" an und beendet die Anwendung. Also, meine Frage ist, sieht jemand Löcher in meinem Plan? Gibt es irgendwelche offensichtlichen Ausnahmen, die ich fangen sollte oder diese decken es ziemlich viel (außer Dateizugriff - ich denke, es gibt nur einen Ort, an dem wir lesen - schreiben in eine Konfigurationsdatei).

    
Colin 20.04.2010, 05:54
quelle

2 Antworten

2

Ich würde try / finally (oder die using-Anweisung, die äquivalent ist) für Ihr Rollback verwenden, anstatt es in einem catch-Block zu tun. Insbesondere wenn Sie nur bestimmte Ausnahmen abfangen, möchten Sie immer noch, dass der Datenbank-Rollback stattfindet, wenn ein unerwarteter Exception-Typ ausgelöst wird.

Mit wenigen Ausnahmen verwende ich selten irgendwo einen Haken außer:

  • An einer physischen Tiergrenze verwende ich try / catch mit log / throw im catch-Block, damit Ausnahmen auf dem Server protokolliert werden können. Mit neueren Technologien wie WCF können Ausnahmen ohne try / catch (z. B. mit WCF DispatchBehavior) protokolliert werden.

  • In einer Top-Level-Prozedur in der Präsentationsebene.

In den Geschäfts- und Datenebenen wird es eine Menge Versuche geben (d. h. Anweisungen verwenden), aber fast nie einen Haken.

    
Joe 20.04.2010, 07:08
quelle
2

Scheint so, als würden Sie einige gute Verbesserungen an Ihrer Anwendung vornehmen. Ich wickle im Allgemeinen auch die äußerste Schicht einer Anwendung in einen try/catch Exception -Block ein, so dass unerwartete Ausnahmen (z. B. Runtime) die Anwendung ordnungsgemäß beenden können.

Eine Frage für Sie ist, ob es sinnvoll ist, an die Geschäftslogik die Verantwortlichkeit eines Daten-Rollbacks zu delegieren. Dies scheint besser in der Datenzugriffsebene gekapselt zu sein. Sie könnten dann eine Ausnahme Ihrer Wahl aus der Datenschicht werfen, anstatt diese Schicht zu öffnen, um eine alte Ausnahme auszulösen, denn was passiert mit Ihrer Geschäftslogikschicht, wenn Ihre Datenschicht etwas auslöst, was Sie nicht erwartet haben?

Oder was ist, wenn Sie Ihre Datenzugriffsebene später extrahieren und durch etwas anderes ersetzen? Zumindest müssen Sie all Ihre Rollback-Logik aus der Business-Logik-Ebene entfernen.

    
Chris Knight 20.04.2010 06:23
quelle

Tags und Links