Я зазвичай згоден з більшістю попереджень про аналіз коду, і я намагаюся їх дотримуватися. Однак мені з цим важче:
CA1031: Не вловлюйте загальні типи виключень
Я розумію обґрунтування цього правила. Але на практиці, якщо я хочу вжити однакових дій незалежно від кинутого винятку, чому я б поводився з кожним конкретно? Крім того, якщо я обробляю конкретні винятки, що робити, якщо код, який я викликаю, змінити, щоб у майбутньому викинути новий виняток? Тепер я повинен змінити свій код, щоб обробити цей новий виняток. Тоді як, якщо я просто спіймав Exception
код, його не потрібно змінювати.
Наприклад, якщо Foo викликає Bar, і Foo потрібно припинити обробку, незалежно від типу винятку, викинутого Bar, чи є якась перевага в тому, щоб конкретно визначити тип виключення, який я ловлю?
Можливо, кращий приклад:
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.
}
}
Якщо ви не ловите загальний виняток тут, вам доведеться спіймати кожен можливий виняток. У Патріка є хороший момент, який OutOfMemoryException
не слід вирішувати таким чином. Що робити, якщо я хочу ігнорувати кожен виняток, але OutOfMemoryException
?
OutOfMemoryError
, що саме з цього Exception
дерева є окремим від спадкового дерева
OutOfMemoryException
? Той самий код обробки, що і все інше?