Para lançar exceções, eu costumo usar classes de exceção internas, por exemplo, ArgumentNullException
e NotSupportedException
. No entanto, às vezes eu 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 isso no meu código. Mas hoje me deparei com a ApplicationException
classe - eu deveria estar usando isso? Para que serve isto?
Parece ineficiente ter muitas classes Exception efetivamente idênticas com nomes diferentes (geralmente não preciso de nenhuma funcionalidade individual). Mas não gosto da idéia de pegar um genérico ApplicationException
e ter que usar código extra para determinar qual foi o erro.
Onde deve se ApplicationException
encaixar no meu código?
c#
.net
exception
exception-handling
James
fonte
fonte
Respostas:
De acordo com as observações no msdn:
Derive-os de
Exception
. Além disso, não vejo problema em criar novas exceções para seus casos, desde que isso seja justificado. Se você encontrar um caso em que já exista uma exceção na estrutura, use isso, caso contrário, role o seu próprio.fonte
ApplicationException
é inútil e existe apenas por causa da compatibilidade com versões anteriores?A resposta curta é: nenhum lugar.
É uma relíquia do passado, em que a Microsoft pretendia que os desenvolvedores herdassem todas as exceções personalizadas do ApplicationException. Logo depois, eles mudaram de idéia e aconselharam que as exceções personalizadas deveriam derivar da classe Exception básica. Consulte Práticas recomendadas para lidar com exceções no MSDN.
Uma das razões mais amplamente divulgadas para isso vem de um esforço de Jeffery Richter nas Diretrizes de Design da Estrutura :
Então aí está. O resumo executivo é que ApplicationException não é prejudicial , apenas inútil .
fonte
Whizbang
decidir que deseja ter todas as suas exceções sob uma hierarquia comum, o usoApplicationException
para esse fim não ofereceria realmente nenhuma vantagem sobre o uso de umaWhizbangException
classe base personalizada . O problema mais sério na hierarquia de exceções do .net não está noApplicationException
entanto, mas com a falha em separar as exceções em categorias relacionadas ao problema, provavelmente fatal de aplicativo, provavelmente fatal de thread e local, além da incapacidade de ter exceções "compostas" significativas.finally
bloco enquanto outra exceção estiver pendente, oscatch
blocos mais adiante na pilha de chamadas deverão ser acionados se corresponderem a qualquer exceção aninhada, mas deixar outras exceções pendentes para que a saída umcatch
bloco prosseguiria para outrocatch
bloco dentro do mesmotry
bloco (se houver algum), e sair de umfinally
bloco com qualquer exceção pendente passaria para o próximo externocatch
oufinally
.No design inicial, no .NET 1.0, foi planejado que a própria estrutura fosse lançada
SystemException
e derivada; enquanto aplicativos de usuário - lançaráApplicationException
e derivados.Mas, mais tarde, no .NET 2.0, isso foi descartado.
Derivam assim
Exception
.fonte