when - exception user unhandled c#




O que é ApplicationException no.NET? (2)

Para lançar exceções, geralmente uso classes de exceção internas, por exemplo, ArgumentNullException e NotSupportedException . No entanto, às vezes preciso usar uma exceção personalizada e, nesse caso, escrevo:

class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }

e assim por diante. Então eu jogo e pego no meu código. Mas hoje me deparei com a classe ApplicationException - devo usar isso em vez disso? Para que serve isto?

Parece ineficiente ter muitas classes de exceção efetivamente idênticas com nomes diferentes (normalmente não preciso de nenhuma funcionalidade individual). Mas eu não gosto da idéia de pegar um ApplicationException genérico e ter que usar código extra para determinar qual foi o erro.

Onde deve se aplicar ApplicationException com o meu código?


A resposta curta é: em nenhum lugar.

É uma relíquia do passado, onde a Microsoft pretendia que os desenvolvedores herdassem todas as exceções personalizadas de ApplicationException. Logo depois, eles mudaram de ideia e avisaram que as exceções personalizadas deveriam derivar da classe Exception base. Veja as Melhores Práticas para Tratamento de Exceções no MSDN.

Uma das razões mais amplamente divulgadas para isso vem de um esforço de Jeffery Richter no Framework Design Guidelines :

System.ApplicationException é uma classe que não deve fazer parte do .NET Framework. A ideia original era que classes derivadas de SystemException indicariam exceções lançadas a partir do próprio CLR (ou sistema), enquanto exceções não-CLR seriam derivadas de ApplicationException . No entanto, muitas classes de exceção não seguiram esse padrão. Por exemplo, TargetInvocationException (que é lançado pelo CLR) é derivado de ApplicationException . Então, a classe ApplicationException perdeu todo o significado. O motivo para derivar dessa classe base é permitir que algum código mais alto da pilha de chamadas capture a classe base. Não foi mais possível capturar todas as exceções do aplicativo.

Então você tem isso. O resumo executivo é que ApplicationException não é prejudicial , apenas inútil .


De acordo com as remarks no msdn:

Os aplicativos do usuário, não o common language runtime, lançam exceções personalizadas derivadas da classe ApplicationException. A classe ApplicationException diferencia entre as exceções definidas pelos aplicativos e as exceções definidas pelo sistema.

Se você estiver projetando um aplicativo que precisa criar suas próprias exceções, é recomendável derivar exceções personalizadas da classe Exception. Pensou-se originalmente que as exceções personalizadas deviam derivar da classe ApplicationException; no entanto, na prática, isso não foi encontrado para agregar valor significativo. Para obter mais informações, consulte Práticas recomendadas para lidar com exceções.

Derive-os da Exception . Além disso, não vejo problema em criar novas exceções para seus casos, desde que isso seja garantido. Se você encontrar um caso em que já existe uma exceção no framework, use isso, caso contrário, role o seu próprio.







exception-handling