Normalerweise stimme ich den meisten Warnungen zur Codeanalyse zu und versuche, diese einzuhalten. Allerdings fällt es mir hier schwerer:
CA1031: Allgemeine Ausnahmetypen nicht abfangen
Ich verstehe die Gründe für diese Regel. Aber wenn ich in der Praxis unabhängig von der ausgelösten Ausnahme die gleiche Aktion ausführen möchte, warum sollte ich dann jede einzelne speziell behandeln? Was passiert, wenn sich der von mir aufgerufene Code ändert, um in Zukunft eine neue Ausnahme auszulösen, wenn ich bestimmte Ausnahmen behandle? Jetzt muss ich meinen Code ändern, um diese neue Ausnahme zu behandeln. Wenn ich Exception
meinen Code einfach fange , muss er sich nicht ändern.
Wenn Foo beispielsweise Bar aufruft und Foo die Verarbeitung unabhängig von der Art der von Bar ausgelösten Ausnahmebedingung beenden muss, hat es dann einen Vorteil, die Art der Ausnahmebedingung zu bestimmen, die ich abfange?
Vielleicht ein besseres Beispiel:
public void Foo()
{
// Some logic here.
LogUtility.Log("some message");
}
public static void Log()
{
try
{
// Actual logging here.
}
catch (Exception ex)
{
// Eat it. Logging failures shouldn't stop us from processing.
}
}
Wenn Sie hier keine allgemeine Ausnahme abfangen, müssen Sie alle möglichen Arten von Ausnahmen abfangen. Patrick hat einen guten Punkt, der OutOfMemoryException
nicht auf diese Weise behandelt werden sollte. Was ist, wenn ich jede Ausnahme ignorieren möchte OutOfMemoryException
?
OutOfMemoryError
, die aus Exception
diesem Grund von der Erbschaft Baum getrennt ist
OutOfMemoryException
? Gleicher Code wie alles andere?