CA1031: Non rilevare tipi di eccezione generali

Proprietà valore
ID regola CA1031
Title Non rilevare tipi di eccezione generali
Categoria Progettazione
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 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;
        }
    }
}

CA2200: Eseguire il rethrow per mantenere i dettagli dello stack