Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| Propriedade | valor |
|---|---|
| ID da regra | CA1031 |
| Título | Não capture tipos gerais de exceção |
| Categoria | Desenho |
| A correção causa interrupção ou não | Ininterrupto |
| Habilitado por padrão no .NET 10 | Não |
| Línguas aplicáveis | C# e Visual Basic |
Motivo
Uma exceção geral, como System.Exception ou System.SystemException, é capturada numa instrução catch, ou uma cláusula geral de captura, como catch(), é usada.
Por padrão, essa regra sinaliza apenas os tipos de exceção gerais que estão sendo capturados, mas isso é configurável.
Descrição da regra
Não devem ser apanhadas exceções gerais.
Como corrigir violações
Para corrigir uma violação desta regra, capture uma exceção mais específica ou relance a exceção geral como a última instrução no bloco catch.
Quando suprimir avisos
Não suprima um aviso desta regra. Detetar tipos gerais de exceções pode ocultar problemas em tempo de execução do utilizador da biblioteca e dificultar a depuração.
Nota
A partir do .NET Framework 4, o Common Language Runtime (CLR) já não entrega exceções de estado corrompido que ocorrem no sistema operativo e no código gerido, como violações de acesso no Windows, para serem geridas por código gerido. Se você deseja compilar um aplicativo no .NET Framework 4 ou versões posteriores e manter a manipulação de exceções de estado corrompido, você pode aplicar o HandleProcessCorruptedStateExceptionsAttribute atributo ao método que manipula a exceção de estado corrompido.
Configurar código para análise
Use a opção a seguir para configurar em quais partes da sua base de código executar essa regra.
Você pode configurar essa opção apenas para esta regra, para todas as regras às quais ela se aplica ou para todas as regras nesta categoria (Design) às quais ela se aplica. Para obter mais informações, consulte Opções de configuração da regra de qualidade de código.
Nomes de tipo de exceção não permitidos
Você pode configurar quais tipos de exceção são impedidos de serem capturados. Por exemplo, para especificar que a regra deve sinalizar catch manipuladores com NullReferenceException, adicione o seguinte par chave-valor a um arquivo .editorconfig em seu projeto:
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Formatos de nome de tipo permitidos no valor da opção (separados por |):
- Digite apenas o nome (inclui todos os símbolos que tenham o nome, independentemente do tipo ou espaço de nomes que os contenham)
- Nomes totalmente qualificados no formato de ID de documentação do símbolo com um
T:prefixo.
Exemplos:
| Valor da opção | Resumo |
|---|---|
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType |
Corresponde a todos os símbolos chamados 'ExceptionType' na compilação. |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
Corresponde a todos os símbolos chamados 'ExceptionType1' ou 'ExceptionType2' na compilação. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Corresponde a tipos específicos chamados 'ExceptionType' com um nome totalmente qualificado. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
Corresponde a tipos denominados 'ExceptionType1' e 'ExceptionType2' com os respetivos nomes totalmente qualificados. |
Você pode configurar essas opções apenas para esta regra, para todas as regras às quais elas se aplicam ou para todas as regras nesta categoria (Design) às quais elas se aplicam. Para obter mais informações, consulte Opções de configuração da regra de qualidade de código.
Exemplo
O exemplo a seguir mostra um tipo que viola essa regra e um tipo que implementa corretamente o catch bloco.
Imports System
Imports System.IO
Namespace ca1031
' Creates two violations of the rule.
Public Class GenericExceptionsCaught
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
Catch ex As SystemException
Console.WriteLine("Unable to open {0}.", inFile)
End Try
Try
outStream = File.Open(outFile, FileMode.Open)
Catch
Console.WriteLine("Unable to open {0}.", outFile)
End Try
End Sub
End Class
Public Class GenericExceptionsCaughtFixed
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
' Fix the first violation by catching a specific exception.
Catch ex As FileNotFoundException
Console.WriteLine("Unable to open {0}.", inFile)
' For functionally equivalent code, also catch the
' remaining exceptions that may be thrown by File.Open
End Try
Try
outStream = File.Open(outFile, FileMode.Open)
' Fix the second violation by re-throwing the generic
' exception at the end of the catch block.
Catch
Console.WriteLine("Unable to open {0}.", outFile)
Throw
End Try
End Sub
End Class
End Namespace
// Creates two violations of the rule.
public class GenericExceptionsCaught
{
private readonly FileStream? _inStream;
private readonly FileStream? _outStream;
public GenericExceptionsCaught(string inFile, string outFile)
{
try
{
_inStream = File.Open(inFile, FileMode.Open);
}
catch (SystemException)
{
Console.WriteLine($"Unable to open {inFile}.");
}
try
{
_outStream = File.Open(outFile, FileMode.Open);
}
catch
{
Console.WriteLine($"Unable to open {outFile}.");
}
}
}
public class GenericExceptionsCaughtFixed
{
private readonly FileStream? _inStream;
private readonly FileStream _outStream;
public GenericExceptionsCaughtFixed(string inFile, string outFile)
{
try
{
_inStream = File.Open(inFile, FileMode.Open);
}
// Fix the first violation by catching a specific exception.
catch (FileNotFoundException)
{
Console.WriteLine($"Unable to open {inFile}.");
}
// For functionally equivalent code, also catch
// remaining exceptions that may be thrown by File.Open
try
{
_outStream = File.Open(outFile, FileMode.Open);
}
// Fix the second violation by rethrowing the generic
// exception at the end of the catch block.
catch
{
Console.WriteLine($"Unable to open {outFile}.");
throw;
}
}
}