CA1031: Non rilevare tipi di eccezione generali
Proprietà | valore |
---|---|
ID regola | CA1031 |
Title | Non rilevare tipi di eccezione generali |
Categoria | Progettazione |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Un'eccezione generale, System.Exception ad esempio o System.SystemException viene intercettata in un'istruzione o in una catch
clausola catch generale, catch()
ad esempio viene usata.
Per impostazione predefinita, questa regola contrassegna solo i tipi di eccezioni generali rilevati, ma è configurabile.
Descrizione regola
Le eccezioni generali non devono essere rilevate.
Come correggere le violazioni
Per correggere una violazione di questa regola, intercettare un'eccezione più specifica o rigenerare l'eccezione generale come ultima istruzione nel catch
blocco.
Quando eliminare gli avvisi
Non escludere un avviso da questa regola. L'intercettazione dei tipi di eccezioni generali può nascondere i problemi di runtime dall'utente della libreria e può rendere più difficile il debug.
Nota
A partire da .NET Framework 4, Common Language Runtime (CLR) non recapita più eccezioni di stato danneggiate che si verificano nel sistema operativo e nel codice gestito, ad esempio violazioni di accesso in Windows, da gestire dal codice gestito. Se si vuole compilare un'applicazione in .NET Framework 4 o versioni successive e gestire le eccezioni di stato danneggiato, è possibile applicare l'attributo HandleProcessCorruptedStateExceptionsAttribute al metodo che gestisce l'eccezione di stato danneggiato.
Configurare il codice da analizzare
Usare l'opzione seguente per configurare le parti della codebase in cui eseguire questa regola.
È possibile configurare questa opzione solo per questa regola, per tutte le regole a cui si applica o per tutte le regole in questa categoria (Progettazione) a cui si applica. Per altre informazioni, vedere Opzioni di configurazione delle regole di qualità del codice.
Nomi di tipi di eccezione non consentiti
È possibile configurare i tipi di eccezione che non possono essere rilevati. Ad esempio, per specificare che la regola deve contrassegnare catch
i gestori con NullReferenceException
, aggiungere la coppia chiave-valore seguente a un file con estensione editorconfig nel progetto:
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Formati di nome del tipo consentiti nel valore dell'opzione (separati da |
):
- Solo nome di tipo (include tutti i simboli con il nome, indipendentemente dal tipo o dallo spazio dei nomi contenitore)
- Nomi completi nel formato ID della documentazione del simbolo con un
T:
prefisso.
Esempi:
Valore opzione | Riepilogo |
---|---|
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType |
Corrisponde a tutti i simboli denominati 'ExceptionType' nella compilazione. |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
Corrisponde a tutti i simboli denominati 'ExceptionType1' o 'ExceptionType2' nella compilazione. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Corrisponde a tipi specifici denominati 'ExceptionType' con il nome completo specificato. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
Corrisponde ai tipi denominati 'ExceptionType1' e 'ExceptionType2' con i rispettivi nomi completi. |
È possibile configurare queste opzioni solo per questa regola, per tutte le regole a cui si applica o per tutte le regole in questa categoria (Progettazione) a cui si applica. Per altre informazioni, vedere Opzioni di configurazione delle regole di qualità del codice.
Esempio
Nell'esempio seguente viene illustrato un tipo che viola questa regola e un tipo che implementa correttamente il catch
blocco.
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
{
FileStream? inStream;
FileStream? outStream;
public GenericExceptionsCaught(string inFile, string outFile)
{
try
{
inStream = File.Open(inFile, FileMode.Open);
}
catch (SystemException)
{
Console.WriteLine("Unable to open {0}.", inFile);
}
try
{
outStream = File.Open(outFile, FileMode.Open);
}
catch
{
Console.WriteLine("Unable to open {0}.", outFile);
}
}
}
public class GenericExceptionsCaughtFixed
{
FileStream? inStream;
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 {0}.", 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 {0}.", outFile);
throw;
}
}
}
Regole correlate
CA2200: Eseguire il rethrow per mantenere i dettagli dello stack