Normalmente, concordo com a maioria dos avisos de análise de código e tento segui-los. No entanto, estou tendo mais dificuldade com este:
CA1031: Não captura tipos de exceção gerais
Eu entendo a lógica dessa regra. Mas, na prática, se eu quero executar a mesma ação, independentemente da exceção lançada, por que lidaria com cada uma delas especificamente? Além disso, se eu lidar com exceções específicas, e se o código que estou chamando for alterado para lançar uma nova exceção no futuro? Agora eu tenho que mudar meu código para lidar com essa nova exceção. Considerando que se eu simplesmente peguei Exception
meu código não precisa mudar.
Por exemplo, se Foo chama Bar e Foo precisa parar de processar, independentemente do tipo de exceção lançada por Bar, há alguma vantagem em ser específico sobre o tipo de exceção que estou capturando?
Talvez um exemplo melhor:
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.
}
}
Se você não capturar uma exceção geral aqui, precisará capturar todos os tipos de exceção possíveis. Patrick tem um bom argumento que OutOfMemoryException
não deve ser tratado dessa maneira. E daí se eu quiser ignorar todas as exceções OutOfMemoryException
?
OutOfMemoryError
, que é separado da Exception
árvore de herança por essa mesma razão
OutOfMemoryException
? O mesmo código de manipulação que tudo o resto?