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 ...