CA1065: Não gere exceções em locais inesperados
Property | valor |
---|---|
ID da regra | CA1065 |
Título | Não levante exceções em locais inesperados |
Categoria | Desenho |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 8 | Não |
Motivo
Um método que não se espera que lance exceções lança uma exceção.
Descrição da regra
Os métodos que não devem gerar exceções podem ser categorizados da seguinte forma:
- Métodos de obtenção de propriedade
- Métodos de acesso a eventos
- Métodos iguais
- Métodos GetHashCode
- Métodos ToString
- Construtores estáticos
- Finalizadores
- Métodos de eliminação
- Operadores de igualdade
- Operadores de fundição implícitos
As seções a seguir discutem esses tipos de método.
Métodos de obtenção de propriedade
As propriedades são basicamente campos inteligentes. Portanto, eles devem se comportar como um campo tanto quanto possível. Os campos não lançam exceções e as propriedades também não. Se você tiver uma propriedade que lança uma exceção, considere torná-la um método.
As seguintes exceções podem ser lançadas de um método get de propriedade:
- System.InvalidOperationException e todos os derivados (incluindo System.ObjectDisposedException)
- System.NotSupportedException e todos os derivados
- System.ArgumentException (somente a partir de get indexado)
- System.Collections.Generic.KeyNotFoundException (somente a partir de get indexado)
Métodos de acesso a eventos
Os acessadores de eventos devem ser operações simples que não geram exceções. Um evento não deve lançar uma exceção quando você tenta adicionar ou remover um manipulador de eventos.
As seguintes exceções podem ser lançadas de um acessador de eventos:
- System.InvalidOperationException e todos os derivados (incluindo System.ObjectDisposedException)
- System.NotSupportedException e todos os derivados
- System.ArgumentException e derivados
Métodos iguais
Os seguintes métodos Equals não devem gerar exceções:
Um Equals
método deve retornar true
ou false
em vez de lançar uma exceção. Por exemplo, se Equals
for passado dois tipos incompatíveis, ele deve apenas retornar false
em vez de lançar um ArgumentException.
Métodos GetHashCode
Os seguintes GetHashCode
métodos geralmente não devem lançar exceções:
GetHashCode
deve sempre devolver um valor. Caso contrário, você pode perder itens na tabela de hash.
As versões GetHashCode
desse argumento podem lançar um ArgumentException. No entanto, Object.GetHashCode
nunca deve lançar uma exceção.
Métodos ToString
O depurador usa System.Object.ToString para ajudar a exibir informações sobre objetos em formato de cadeia de caracteres. Portanto, ToString
não deve alterar o estado de um objeto e não deve lançar exceções.
Construtores estáticos
Lançar exceções de um construtor estático faz com que o tipo seja inutilizável no domínio do aplicativo atual. Você deve ter um bom motivo (como um problema de segurança) para lançar uma exceção de um construtor estático.
Finalizadores
Lançar uma exceção de um finalizador faz com que o CLR falhe rapidamente, o que destrói o processo. Portanto, evite lançar exceções em um finalizador.
Métodos de eliminação
Um System.IDisposable.Dispose método não deve lançar uma exceção. Dispose
é frequentemente chamado como parte da lógica de limpeza em uma finally
cláusula. Portanto, lançar explicitamente uma exceção de força o usuário a adicionar tratamento de Dispose
exceção dentro da finally
cláusula.
O Dispose(false)
caminho do código nunca deve lançar exceções, porque Dispose
quase sempre é chamado a partir de um finalizador.
Operadores de igualdade (==, !=)
Como Equals
os métodos, os operadores de igualdade devem retornar ou true
, false
e não devem lançar exceções.
Operadores de fundição implícitos
Como o usuário muitas vezes não sabe que um operador de cast implícito foi chamado, uma exceção lançada pelo operador de cast implícito é inesperada. Portanto, nenhuma exceção deve ser lançada pelos operadores de elenco implícitos.
Como corrigir violações
Para os getters de propriedade, altere a lógica para que ela não precise mais lançar uma exceção ou altere a propriedade em um método.
Para todos os outros tipos de método listados anteriormente, altere a lógica para que ela não precise mais lançar uma exceção.
Quando suprimir avisos
Se a violação foi causada por uma declaração de exceção em vez de uma exceção lançada, é seguro suprimir um aviso dessa regra.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.