Frage

Seit Microsoft die Applikationsblöcke eingeführt hat, habe ich in Menschen wurden stoßen, die die Ausnahme Application Block Handhabung . Ich habe erst seit kurzem ein näher mich schauen und würde die grundlegende Funktionalität wie folgt zusammenfassen (überspringen Sie den folgenden Block, wenn Sie bereits wissen, was es tut):

  

Die Ausnahmebehandlung Anwendungsblock zielt darauf ab, zu zentralisieren und vollständig konfigurierbar mit make config-Dateien des folgenden Schlüsselausnahmebehandlung Aufgaben :

     
      
  • Logging eine Ausnahme
  •   
  • Ersetzen einer Exception
  •   
  • Verpackung eine Ausnahme
  •   
  • Propagierung eine Ausnahme
  •   
  • etc.
  •   
     

Die Bibliothek tut das, indem Sie Ihre Try-Catch-Blöcke wie folgt ändern:

try
{
  // Run code.
}
catch(DataAccessException ex)
{
    bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy");
    if (rethrow)
    {
        throw;
    }
}
     

Nach dem, was in der app.config für die Richtliniennamen angegeben ( sehen hier für docs ), Handle wird entweder ...

     
      
  • wirft eine völlig neue Ausnahme (ersetzt die ursprüngliche Ausnahme)
  •   
  • wickeln die ursprüngliche Ausnahme in einem neuen und werfen, dass
  •   
  • schlucken die Ausnahme (das heißt nichts tun)
  •   
  • haben Sie die ursprüngliche Ausnahme erneut auslösen
  •   
     

Zusätzlich können Sie auch so konfigurieren, dass vorher mehr Dinge zu tun (zum Beispiel log die Ausnahme).

Jetzt ist hier mein Problem: Ich kann nicht vollständig zu sehen, wie es von Vorteil sein kann, um es konfigurierbar, ob eine Ausnahme ersetzt wird, eingewickelt, geschluckt oder erneut ausgelöst. Nach meiner Erfahrung ist diese Entscheidung zu der Zeit Sie den Code schreibt gemacht werden, da Sie in der Regel die Umgebung oder Telefonvorwahl ändern müssen werden, wenn Sie die Ausnahmebehandlung Verhalten ändern.

Zum Beispiel wird der Code wahrscheinlich falsch verhalten gestartet, wenn Sie so neu konfigurieren, dass eine bestimmte Ausnahme an einem bestimmten Punkt geworfen jetzt statt erneut ausgelöst geschluckt wird (es könnte Code nach dem catch-Block, das nicht ausgeführt werden muss, wenn die Ausnahme tritt ein). Das gleiche gilt für alle anderen möglichen Änderungen in Ausnahmebehandlung (z ersetzen -> rethrow, schlucken -> Wrap).

mir also ist das Endergebnis, dass die Ausnahmebehandlung Block Probleme löst, die in der Praxis gibt es nicht wirklich. Die Ausnahme Protokollierung und anmelde Bit ist in Ordnung, aber nicht all die anderen Dinge nur ein perfektes Beispiel für Overengineering?

War es hilfreich?

Lösung

Wenn Sie Ausnahmen für die Ablaufsteuerung verwenden, dann würden Sie von richtlinienbasierten bleiben wollen weg Ausnahmebehandlung.

Aber im Fall von Ausnahmen, die Sie als nicht erstattungs (ein Hintergrund-Task fehlgeschlagen ist, die Steckdose getrennt wurde, wird die Datei gelöscht wurde, etc.) behandeln möchten, können Sie konfigurierbare, richtlinienbasierte Ausnahmebehandlung haben wollen .

Zum Beispiel, wenn Sie eine API entwickeln, können Sie nur die Standard Ausnahmen (ArgumentException, etc.), sowie die eigene Bibliothek spezifische Ausnahme im Fall eines inneren jede Funktion in Ihrem API Wurf haben wollen nicht-Standard-Ausnahme (beispielsweise ein MyLibraryException). Bei dieser Art der Fall ist alles, was zählt, ist, dass etwas nicht richtig funktionierte. Sie sind nicht Kommissionierung die Ausnahme auseinander und herauszufinden, was schief gelaufen ist. Bestätigen Sie einfach die Tatsache, dass einige , was schief gelaufen ist, und dass Sie tun sollen einige , was jetzt.

Das einige , was sollte konfigurierbar sein, weil es nicht wirklich wichtig, das tut, was Sie tun. Zeigen Sie eine Message-Box für den Benutzer? Modal oder nicht-modal? Melden Sie sich die Ausnahme? Wie wollen Sie die Ausnahme anmelden? Rufen Sie einen Logging-Web-Service? Fügen Sie in eine Protokolldatei? Schreiben Sie an die Windows-Ereignisprotokoll? Legen Sie einen Eintrag in die Datenbank? Legen Sie einen Eintrag in zwei Datenbanken? Es ist wirklich nicht auf den Rest der Anwendung wichtig sind. Die Wahl, wie eine Ausnahme zu handhaben ist vollständig orthogonal zu dem Rest der Anwendung.

(Nebenbei ist dies nicht, wie ich Ansatz konfigurierbare richtlinienbasierte Ausnahmebehandlung. Ich würde mehr in Richtung eines AOP Stil neigt dazu, wie ein Ausnahme-Logger-Interceptor im Behälter Registrierung).

Andere Tipps

Ich laufe in dieses Problem, wenn ich Funktionen entwickle, die keine wiederherstellbaren Zustand haben. Ich glaube, dass diese Politik getrieben Ausnahmebehandlung tatsächlich nützlich ist, und stellt sicher, dass alle anderen Entwickler, die tatsächlich für nicht erstattungs Ausnahmen von einem Standard entsprechen Teil dieses Projektes sind.

ich mit den Plakaten einverstanden oben, können Sie weg basierte Ausnahmen von der Richtlinie bleiben wollen, wenn Sie sie für die Ablaufsteuerung verwenden.

Ich habe mit der Aussage zustimmen, dass „die Ausnahmebehandlung Block Probleme löst, die in der Praxis gibt es nicht wirklich.“ Ich habe den Block seit seiner Veröffentlichung verwendet und ich selten das Gefühl, dass ich tatsächlich viel bin mit ihm zu gewinnen. Nun, vielleicht ein wenig Kopfschmerzen. :)

Bevor Sie beginnen, werde ich zugeben, dass ich wie die Ausnahme Abschirmung bei WCF Service-Grenzen Funktionalität. dass jedoch wurde vor kurzem hinzugefügt, beinhaltet keine Codierung - nur Attribute und Konfiguration und ist nicht, wie der Block in der Regel verkauft wird. Dies ist, wie Microsoft zeigt es unter http://msdn.microsoft.com/en -US / library / cc309250.aspx

In meinen Augen ist die obige Ablaufsteuerung.

try
{
  // Run code.
}
catch(DataAccessException ex)
{
    bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy");
    if (rethrow)
    {
        throw;
    }
}

Wenn Sie die Flusskontrolle Aspekt mit dem Code kombinieren oben Sie definitiv nicht machen falschen Code-Look falsch . (Kümmern Sie nie, dass die if (rethrow) Konstrukt nicht sehr viel Abstraktion bietet.) Diese Wartung für Entwickler nicht vertraut mit den politischen Definitionen erschweren können. Wenn die postHandlingAction in der Konfigurationsdatei geändert wird (es wird wahrscheinlich irgendwann passieren) Sie wahrscheinlich die Anwendung finden auf unerwartete Weise zu verhalten, die nie getestet haben.

Vielleicht würde ich es nicht für verwerflich, wenn der Block nicht Flusskontrolle behandeln, sondern einfach Sie Kettenlader zusammen erlaubt.

Aber vielleicht auch nicht. Ich weiß nicht wirklich immer erinnern wird gebeten:

  • ein neues Stück Funktionalität hinzuzufügen, wenn eine Ausnahme (zB neben der Anmeldung in das Ereignisprotokoll auch eine E-Mail senden. Eigentlich Handhabung kann der Logging-Block das allein tun, wenn Sie bereits die Ausnahme Anmeldung wurden selbst. :) )
  • die Ausnahmebehandlung Verhalten ändern (schlucken, rethrow oder werfen neu) über eine gesamte „Politik“.

Ich sage nicht, dass es nicht passiert (Ich bin sicher, dass jemand hat eine Geschichte!); Ich fühle mich einfach, dass die Ausnahmebehandlung Application Blockes macht Programme schwieriger zu verstehen und zu pflegen und dies in der Regel schwerer wiegt als die Funktionalität durch den Block zur Verfügung gestellt.

Ich glaube nicht, das über Engineering überhaupt. eigentlich. die Tatsache, dass Ausnahmen durch einen zentralen Handler hat eine gute Sache in meiner Arbeit passieren können. Ich habe Entwickler hatte die jede Ausnahme essen würde - behandelt oder nicht, so dass es nicht Blase nach oben würde und legte etwas alarmierend vor dem Endverbraucher oder ernsthaft versaut einen Dienst / Daemon, wenn nicht abgefangene.

jetzt mit der Politik können wir jederzeit Anmeldung starten, ohne oder unnötig in dem gesamten App bestreuen Protokollierung Logik neu starten zu müssen. wir können jetzt Ausnahmen beobachten und dergleichen alle ohne die App offline zu nehmen.

smart Programmierung wenn Sie mich fragen ...

Ganz einfach:., Wenn Sie verschiedene Ausnahmebehandlung in Ihrem Freigabecode wollen als in Ihrem Debug-Code, dann wäre es sinnvoll sein,

Meiner Meinung nach ist ein realer Wert der Exception Handling Blockes der Verwendung beginnt mit der einer Zeile Code in Ihrem Fang Block:

bool rethrow = ExceptionPolicy.HandleException (ex "Data Access Policy");

Eine Zeile Code - wie einfach können Sie bekommen? Hinter dem eine Codezeile, die Politik, wie es konfiguriert ist, macht Zuweisung / Aktualisierungen einer Politik alle leicht ausgeführt, ohne Quellcode neu kompilieren zu müssen.

Wie bereits erwähnt wurde, kann die Ausnahmerichtlinie durchführt tatsächlich viele Aktionen - was auch immer in Ihrer Politik definiert ist. Hiding Komplexität hinter der einer Zeile Code wie in dem catch-Block gezeigt, ist, wo ich ein echten Mehrwert zu sehen.

Ich würde sagen, komplex, aber nicht overengineered. So sind meine Gedanken, dass große Dividenden während der Wartung zu sehen sein wird, wenn Sie benötigen die Art und Weise ändern Sie Handhabung / Protokollierung Ausnahmen durch die Flexibilität, Konfiguration leicht zu ändern, und haben immer noch die gleiche Zeile des Quellcodes.

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