Я обычно согласен с большинством предупреждений анализа кода и стараюсь их придерживаться. Тем не менее, мне сложнее с этим:
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
? Такой же код обработки, как и все остальное?