Sdílet prostřednictvím


CA1031: Nezachycujte výjimky obecného typu

Vlastnost Hodnota
ID pravidla CA1031
Název Nezachycujte výjimky obecného typu
Kategorie Návrh
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 9 No

Příčina

Obecná výjimka, jako System.Exception je nebo System.SystemException je zachycena v catch příkazu, nebo obecná klauzule catch, jako catch() je například použití.

Ve výchozím nastavení toto pravidlo označí příznak pouze obecné typy výjimek, které jsou zachyceny, ale je to možné konfigurovat.

Popis pravidla

Obecné výjimky by neměly být zachycovány.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, zachyťte konkrétnější výjimku nebo znovu zvětšte obecnou výjimku jako poslední příkaz v catch bloku.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo. Zachycení obecných typů výjimek může uživatelům knihovny skrýt problémy za běhu a může ztížit ladění.

Poznámka:

Počínaje rozhraním .NET Framework 4 už modul CLR (Common Language Runtime) nedoručuje poškozené výjimky stavu, ke kterým dochází v operačním systému a spravovaném kódu, jako jsou porušení přístupu ve Windows, které se mají zpracovávat spravovaným kódem. Pokud chcete zkompilovat aplikaci v rozhraní .NET Framework 4 nebo novějších verzích a zachovat zpracování výjimek poškozeného stavu, můžete HandleProcessCorruptedStateExceptionsAttribute použít atribut na metodu, která zpracovává výjimku poškozeného stavu.

Konfigurace kódu pro analýzu

Pomocí následující možnosti nakonfigurujte, ve kterých částech základu kódu se má toto pravidlo spouštět.

Tuto možnost můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (Návrh), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.

Nepovolené názvy typů výjimek

Můžete nakonfigurovat, které typy výjimek nejsou zachyceny. Pokud chcete například určit, že pravidlo má označit obslužné rutiny příznakem catch NullReferenceException, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:

dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException

Povolené formáty názvů typů v hodnotě možnosti (oddělené ):|

  • Pouze název typu (zahrnuje všechny symboly s názvem bez ohledu na typ nebo obor názvů)
  • Plně kvalifikované názvy ve formátu ID dokumentace symbolu s předponouT:.

Příklady:

Hodnota možnosti Shrnutí
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType Odpovídá všem symbolům s názvem ExceptionType v kompilaci.
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 Odpovídá všem symbolům pojmenovaným ExceptionType1 nebo ExceptionType2 v kompilaci.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType Odpovídá konkrétním typům s názvem ExceptionType s daným plně kvalifikovaným názvem.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 Odpovídá typům s názvem ExceptionType1 a ExceptionType2 s odpovídajícími plně kvalifikovanými názvy.

Tyto možnosti můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která se vztahují, nebo pro všechna pravidla v této kategorii (Návrh), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.

Příklad

Následující příklad ukazuje typ, který porušuje toto pravidlo, a typ, který správně implementuje catch blok.

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: Znovu vyvolejte pro zachování podrobností zásobníku