Pergunta

Às vezes eu não conheço o tipo de exceção de bruxa, devo jogar. Então eu geralmente jogo exceção (). Existe um bom artigo sobre isso?

Foi útil?

Solução

Se você não está tentando se recuperar de um erro, você pode simplesmente jogar um Exception com uma string para dizer o que deu errado. (Ou se você executará a mesma ação, independentemente do erro).

Além de torná -lo óbvio para um programador o que deu errado usando um novo nome de exceção, em vez de colocá -lo na mensagem, e a exceção pode conter dados para ajudá -lo a se recuperar de uma exceção específica.

Por exemplo, um ArgumentNullException tem uma propriedade ParamName, que você deve definir quando lançar a exceção. Quando o chamador o pega, ele pode procurar essa propriedade e decidir passar um novo valor para o argumento que causou o erro ou pode imprimir um erro relevante para informar o programador o que deu errado.

É lamentável que as exceções raramente sejam usadas em todo o seu potencial (em muitas APIs de código aberto e outras) e geralmente são simplesmente inseridas para informar a um programador o que deu errado. Não há muita diferença entre esses 2 se você não planeja ler o ParamName propriedade quando você a pegar. (Muitas pessoas não se incomodam e apenas pegam um Exception de qualquer forma).

throw new ArgumentNullException("arg1");
throw new Exception("arg1 is null");

Pode ser difícil recuperar totalmente de um erro, mas em alguns aplicativos, porém, você pode achar desejável criar exceções personalizadas que podem fornecer todos os detalhes necessários.

Por enquanto, eu apenas colocaria Exception na pesquisa do navegador de objetos em vs, e veja o que já existe. Seus nomes são bastante auto -explicativos, para que você possa escolher algo adequado.

Outras dicas

O problema de lançar uma exceção genérica é que ele restringe a capacidade do seu código mais na pilha de lidar com isso corretamente (ou seja, as melhores práticas é prender a exceção mais específica possível antes de recuar e capturar apenas o que você pode lidar).

Jeffrey Richter tem uma excelente seção sobre manuseio de exceções (incluindo informações sobre o espaço de nome System.Exception) em CLR via C#

"Diretrizes de design da estrutura", de Cwalina e Abrahms, abrange muito bem esse tópico (IMHO).

Está disponível gratuitamente online aqui, ou o livro (não grátis) Aqui (Reino Unido) ou aqui (nós). Olhe na seção intitulada Diretrizes de design para exceções.

Bem, a única coisa que você não deve fazer é jogar Exception em si.
Sempre procure uma subclasse apropriada.

Não conheço nenhuma publicação soletrando qual exceção jogar quando, mas ArgumentException e InvalidOperationException deve cuidar da maioria dos seus casos.

Faça perguntas separadas sobre casos separados, se eles surgirem.

Eu sugeriria dividir exceções em algumas categorias com base no estado do sistema:

  1. O método falhou de tal maneira que não fez nada; O estado de quaisquer dados subjacentes não foi perturbado e provavelmente é válido. Cenários típicos: tentando recuperar de uma coleção um objeto que não está lá, ou adicionar um que já está. Outro cenário possível: um tempo limite de comunicações nos casos em que não deveria ter causado nenhuma perda de dados (e estava novamente repetindo a operação se o problema fosse simplesmente que a outra extremidade era simplesmente muito lenta).
  2. O método falhou de maneira que pode ter perturbado a estrutura de dados subjacente, ou a estrutura de dados subjacente pode ter sido corrompida anteriormente. Outras operações não devem ser tentadas com essa estrutura de dados, a menos que sejam tomadas medidas para validá -las. Outro cenário possível: um tempo limite de comunicação ocorre quando um registro foi parcialmente recuperado e os dados parcialmente retirados agora estão perdidos. Dependendo do protocolo, pode ser necessário executar alguma ação de recuperação na conexão ou fechá -la e iniciar uma nova.
  3. Algo está seriamente errado com o estado do sistema, e a recuperação provavelmente não é possível.

Infelizmente, as exceções .NET existentes não se encaixam em nada assim; Teria sido bom se houvesse uma base de exceção do tipo a partir da qual coisas como ThreadAborTexception, CPuHascughtfireexception e a exceção 'normal' foram derivadas e todas as exceções 'normais' foram derivadas da exceção. Eu entendo isso .NET 4.0 ALGUMA ALGUNDA NO TESSE DESNEM, mas não conheço a mecânica exata. De qualquer forma, sugiro que quaisquer exceções definidas pelo usuário sejam divididas em grupos como acima, com todas as exceções em cada grupo compartilhando um ancestral comum distinto de outros grupos.

Há um artigo de Krzysztof Cwalina ("Um arquiteto principal da equipe .NET Framework da Microsoft") chamada Escolhendo o tipo certo de exceção para jogar Isso lança alguma luz sobre isso. Ele lida com a escolha da exceção certa para lançar e orientações sobre a criação de exceções personalizadas.

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