Se jogar System.Exception
é considerado tão ruim, por que não foi Exception
feito abstract
em primeiro lugar?
Dessa forma, não seria possível chamar:
throw new Exception("Error occurred.");
Isso aplicaria o uso de exceções derivadas para fornecer mais detalhes sobre o erro que ocorreu.
Por exemplo, quando quero fornecer uma hierarquia de exceção personalizada para uma biblioteca, geralmente declaro uma classe base abstrata para minhas exceções:
public abstract class CustomExceptionBase : Exception
{
/* some stuff here */
}
E então alguma exceção derivada com um objetivo mais específico:
public class DerivedCustomException : CustomExceptionBase
{
/* some more specific stuff here */
}
Então, ao chamar qualquer método de biblioteca, pode-se ter esse bloco try / catch genérico para capturar diretamente qualquer erro proveniente da biblioteca:
try
{
/* library calls here */
}
catch (CustomExceptionBase ex)
{
/* exception handling */
}
Esta é uma boa prática?
Seria bom se Exception
fosse feito abstrato?
EDIT: Meu argumento aqui é que, mesmo que uma classe de exceção seja marcada abstract
, você ainda pode capturá-la em um bloco catch-all. Tornar isso abstrato é apenas uma maneira de proibir os programadores de lançar uma exceção "super ampla". Geralmente, quando você voluntariamente lança uma exceção, deve saber que tipo é e por que aconteceu. Forçando assim a lançar um tipo de exceção mais específico.