Zwykle zgadzam się z większością ostrzeżeń dotyczących analizy kodu i staram się ich przestrzegać. Mam jednak trudniejszy czas z tym:
CA1031: Nie przechwytuj ogólnych typów wyjątków
Rozumiem uzasadnienie tej reguły. Ale w praktyce, jeśli chcę podjąć to samo działanie niezależnie od zgłoszonego wyjątku, dlaczego miałbym obsługiwać każde z nich konkretnie? Co więcej, jeśli obsłużę określone wyjątki, co się stanie, jeśli kod, który wywołuję, zmieni się, aby wygenerować nowy wyjątek w przyszłości? Teraz muszę zmienić kod, aby obsłużyć ten nowy wyjątek. Natomiast jeśli po prostu złapię, Exception
mój kod nie musi się zmienić.
Na przykład, jeśli Foo wywołuje Bar, a Foo musi przerwać przetwarzanie niezależnie od typu wyjątku zgłoszonego przez Bar, czy jest jakaś korzyść ze sprecyzowania rodzaju wyjątku, który łapię?
Może lepszy przykład:
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.
}
}
Jeśli nie złapiesz tutaj ogólnego wyjątku, musisz złapać każdy możliwy wyjątek. Patrick ma rację, że OutOfMemoryException
nie powinno się z tym postępować w ten sposób. Co jeśli chcę zignorować każdy wyjątek, ale OutOfMemoryException
?
OutOfMemoryError
oddzielny od Exception
drzewa dziedziczenia z tego właśnie powodu
OutOfMemoryException
? Taki sam kod obsługi jak wszystko inne?