Eu deveria derivar exceções personalizadas a partir de Exceção ou ApplicationException em .NET?

StackOverflow https://stackoverflow.com/questions/52753

  •  09-06-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top