Eu deveria derivar exceções personalizadas a partir de Exceção ou ApplicationException em .NET?
Pergunta
O que é a melhor prática ao criar as classes de exceção em um .NET solução:Para derivar a partir de System.Exception
ou a partir de System.ApplicationException
?
Solução
De acordo com Jeffery Richter no Âmbito Diretrizes do Projeto livro:
System.ApplicationException
é uma classe que não deve ser parte do .NET framework.
A intenção era ter algum significado no que você poderia pegar "todas" as exceções de aplicativo, mas o padrão não foi seguido e por isso não tem nenhum valor.
Outras dicas
Você deve derivar exceções personalizadas a partir de System.Exception
.
Mesmo MSDN agora diz para ignorar ApplicationException
:
Se você estiver criando uma aplicação o que precisa para criar o seu próprio exceções, você são aconselhados a derivar exceções personalizadas de Exceção de classe.Ele foi originalmente pensado que exceções personalizadas deve derivar da o ApplicationException classe;no entanto, na prática, isso não foi encontrado para adicionar um valor significativo.Para mais informações, consulte Melhores Práticas para Manipulação de Exceções.
http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx
ApplicationException
considerado inútil é um forte, e crítica, de argumentação contra ApplicationException
.
Resultado:não usá-lo.Derivam de Exception
.
Os autores do framework-se considerar ApplicationException inútil:
http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx
com um bom acompanhamento aqui:
http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx
Quando em dúvida, eu sigo os seus livro-Quadro Diretrizes de Design.
http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756
O tema do blog é discutido lá.
rp
Eu estou acostumado a fazer:
private void buttonFoo_Click()
{
try
{
foo();
}
catch(ApplicationException ex)
{
Log.UserWarning(ex);
MessageVox.Show(ex.Message);
}
catch(Exception ex)
{
Log.CodeError(ex);
MessageBox.Show("Internal error.");
}
}
Ele permite fazer a diferença entre:
- C# sistema de código de erro, que eu devo reparações.
- "Normal" erro do usuário, que não precisa de correção de mim.
Eu sei que não é recomendado o uso de ApplicationException, mas ele funciona muito bem, desde há muito poucas aulas que não respeitam o ApplicationException padrão.