CA1065: Não geram exceções em locais inesperados
TypeName |
DoNotRaiseExceptionsInUnexpectedLocations |
CheckId |
CA1065 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Não separável |
Causa
Um método que não se espera lançar exceções lança uma exceção.
Descrição da regra
Métodos que não são esperados para lançar exceções podem ser categorizados como segue:
Métodos de Get da propriedade
Métodos acessadores de evento
É igual a métodos
Métodos GetHashCode
Métodos ToString
Construtores estáticos
Finalizadores
Métodos de Dispose
Operadores de igualdade
Operadores de conversão implícita
As seções a seguir discutem esses tipos de método.
Métodos de Get da propriedade
Propriedades são campos basicamente inteligentes.Portanto, eles devem se comportar como um campo tanto quanto possível.Campos não lançar exceções e nem devem propriedades.Se você tiver uma propriedade que lança uma exceção, considere a possibilidade de torná-lo um método.
As seguintes exceções podem ser geradas de um método get de propriedade:
System.InvalidOperationExceptione todos os derivativos (incluindo System.ObjectDisposedException)
System.NotSupportedExceptione todos os derivativos
System.ArgumentException(somente de indexados get)
KeyNotFoundException(somente de indexados get)
Métodos acessadores de evento
Acessadores de evento devem ser operações simples que não lançar exceções.Um evento não deve lançar uma exceção ao tentar adicionar ou remover um manipulador de eventos.
As seguintes exceções podem ser geradas de um accesor de evento:
System.InvalidOperationExceptione todos os derivativos (incluindo System.ObjectDisposedException)
System.NotSupportedExceptione todos os derivativos
ArgumentExceptione derivativos
É igual a métodos
O seguinte é igual a métodos não devem lançar exceções:
Um é igual a método deve retornar true ou false em vez de gerar uma exceção.Por exemplo, se Equals é passado dois tipos incompatíveis ele deve simplesmente retornar false em vez de gerar uma ArgumentException.
Métodos GetHashCode
O seguinte GetHashCode métodos não geralmente devem lançar exceções:
GetHashCode sempre deve retornar um valor.Caso contrário, você pode perder os itens na tabela de hash.
As versões do GetHashCode que o levam um argumento pode lançar uma ArgumentException.No entanto, Object.GetHashCode nunca deve acionar uma exceção.
Métodos ToString
O depurador usa Object.ToString para ajudá-lo a exibir informações sobre objetos em formato de seqüência de caracteres.Portanto, ToString não deve alterar o estado de um objeto e ele não deve lançar exceções.
Construtores estáticos
Gerar exceções a partir de um construtor estático faz com que o tipo pode ser usado no domínio do aplicativo atual.Você deve ter um motivo muito bom (como um problema de segurança) para gerar uma exceção de um construtor estático.
Finalizadores
Lançando uma exceção de um finalizador faz com que o CLR falhe rápido, que destrói o processo.Portanto, gerar exceções em um finalizador deve sempre ser evitada.
Métodos de Dispose
A IDisposable.Dispose método não deve acionar uma exceção.Costuma ser chamada de Dispose como parte do que a lógica de limpeza uma finally cláusula.Portanto, explicitamente, lançando uma exceção de Dispose força o usuário adicione dentro de manipulação de exceção do finally cláusula.
O Dispose(false) caminho de código nunca deve lançar exceções, pois isso quase sempre é chamado a partir de um finalizador.
Operadores de igualdade (= =,! =)
Assim como os métodos Equals, operadores de igualdade devem retornar um true ou false e não deve lançar exceções.
Operadores de conversão implícita
Porque o usuário geralmente não sabe o que foi chamado um operador de conversão implícita, uma exceção lançada pelo operador cast implícita é completamente inesperada.Portanto, sem exceções devem ser lançadas de operadores de conversão implícita.
Como corrigir violações
Para getters de propriedade, ou alterar a lógica para que ele não tem mais lançar uma exceção ou alterar a propriedade para um método.
Para todos os outros tipos de método listados anteriormente, altere a lógica para que ele não deve lançar uma exceção.
Quando suprimir avisos
É seguro eliminar um aviso esta regra se a violação tiver sido causada por uma declaração em vez de uma exceção gerada uma exceção.
Regras relacionadas
CA2219: Não geram exceções em cláusulas de exceção