28 Stimmen

Ist die Behandlung von Ausnahmen ein guter Weg?

Wir kämpfen mit einer Richtlinie zur korrekten Behandlung von Ausnahmen in unserer Anwendung. Hier sind unsere Ziele für sie (zusammengefasst):

  • Behandeln Sie nur bestimmte Ausnahmen.
  • Behandeln Sie nur Ausnahmen, die Sie korrigieren können
  • Nur einmal anmelden.

Wir haben eine Lösung gefunden, die eine generische anwendungsspezifische Ausnahme beinhaltet und in einem Stück Code wie folgt funktioniert:

try {
  // Do whatever
}
catch(ArgumentNullException ane)
{
  // Handle, optinally log and continue
}
catch(AppSpecificException)
{
  // Rethrow, don't log, don't do anything else
  throw;
}
catch(Exception e)
{
  // Log, encapsulate (so that it won't be logged again) and throw
  Logger.Log("Really bad thing", e.Message, e);
  throw new AppSpecificException(e)
}

Alle Ausnahmen werden protokolliert und dann in eine AppSpecificException umgewandelt, damit sie nicht erneut protokolliert werden. Schließlich erreicht sie den Event-Handler der letzten Instanz, der sich mit ihr befasst, wenn es sein muss.

Ich habe nicht so viel Erfahrung mit Ausnahmebehandlungsmustern... Ist dies ein guter Weg, um unsere Ziele zu lösen? Hat es irgendwelche großen Nachteile oder große rote Warnungen?

Anmerkung: Einer der Nachteile dabei ist, dass man nach dem ersten Catch die Möglichkeit verliert, eine bestimmte Ausnahme zu behandeln (wenn man eine Methode aufruft, die eine andere Methode aufruft, und die zweite Methode eine Ausnahme auslöst, kann man sie nicht behandeln), aber ich habe festgestellt, dass ich das nie auf irgendeine Weise gemacht habe ... Ich behandle Ausnahmen nur mit einer Ebene der Tiefe ...

0voto

MatthewMartin Punkte 31018

Ich würde empfehlen, sich mehr Gedanken darüber zu machen, welche Muster Sie für die "Übergabe" verwenden wollen.

Wenn Ihre Behandlungsmuster auf log oder rethrow hinauslaufen, dann wird der rethrow-Fehler schließlich protokolliert werden. Am Ende ist es also nur eine Fehlerprotokollierung. Wenn Sie ASP.NET verwenden, verwenden Sie elmah, so dass zumindest Ihr Code nicht mit try/catch-and-log Kesselplatte bedeckt ist.

Es gibt nur wenige Möglichkeiten, Fehler zu "behandeln", die nicht in einer bloßen Protokollierung enden.

Versuchen Sie es erneut. (Achten Sie auf Endlosschleifen)

Warten Sie und versuchen Sie es erneut.

Versuchen Sie es mit einer anderen, aber gleichwertigen Technik (Sie können keine Verbindung über http herstellen, versuchen Sie es über https).

Stellen Sie die fehlenden Bedingungen fest (erstellen Sie den Ordner, der die FolderNotFoundException ausgelöst hat)

Ignorieren Sie den Fehler - denken Sie zweimal darüber nach, es macht nur Sinn, wenn der Fehler nicht wirklich ein Problem ist, z. B. wenn eine Bibliothek eines Drittanbieters Sie vor einer Bedingung warnt, die nicht zutrifft.

-1voto

JoeBilly Punkte 3007

Eine gute Lösung für die Behandlung von Ausnahmen ist die Verwendung von Interception. Sie müssen jedoch überprüfen, ob dieses Muster je nach Architektur auf Ihre Anwendung angewendet werden kann: Interception erfordert einen Container.

Das Prinzip besteht darin, die Behandlung von Ausnahmen außerhalb der Methoden durch die Verwendung von (benutzerdefinierten) Attributen zu faktorisieren und dann den Container zur Initialisierung der Instanzen zu verwenden. Der Container wird diese Instanzen durch Reflektion abfangen: Seine Instanzen heißen Interceptors. Sie müssen nur Ihre Methoden wie gewohnt über diese Instanzen aufrufen und den Abfangmechanismus die Arbeit erledigen lassen, die Sie vor oder nach der Methode kodiert haben.

Beachten Sie, dass Sie in den Methoden try catch hinzufügen können, um bestimmte Ausnahmen zu verwalten, die in Ihren Interceptoren nicht verwaltet werden.

Einheitlich abfangen : http://msdn.microsoft.com/en-us/library/dd140045.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X