Megosztás a következőn keresztül:


CA1031: Ne kapja meg az általános kivételtípusokat

Tulajdonság Érték
Szabályazonosító CA1031
Cím Ne kapja meg az általános kivételtípusokat
Kategória Design
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

Ok

Egy általános kivétel, például System.ExceptionSystem.SystemException egy utasítás vagy egy catch általános fogási záradék, például catch() a használatban van.

Alapértelmezés szerint ez a szabály csak az általános kivételtípusokat jelöli, de ez konfigurálható.

Szabály leírása

Általános kivételeket nem szabad kifogni.

Szabálysértések kijavítása

A szabály megsértésének kijavításához észleljen egy konkrétabb kivételt, vagy az általános kivételt a blokk utolsó utasításaként hárítsa catch el.

Mikor kell letiltani a figyelmeztetéseket?

Ne tiltsa el a szabály figyelmeztetését. Az általános kivételtípusok elfogása elrejtheti a futásidejű problémákat a tár felhasználója elől, és megnehezítheti a hibakeresést.

Feljegyzés

A 4. .NET-keretrendszer kezdve a közös nyelvi futtatókörnyezet (CLR) már nem biztosít sérült állapotbeli kivételeket, amelyek az operációs rendszerben és a felügyelt kódban fordulnak elő, például a Windows hozzáférés-megsértéseit, amelyeket felügyelt kóddal kell kezelni. Ha .NET-keretrendszer 4 vagy újabb verzióban szeretne lefordítani egy alkalmazást, és fenn szeretné tartani a sérült állapotkivételek kezelését, alkalmazhatja az HandleProcessCorruptedStateExceptionsAttribute attribútumot a sérült állapotkivételt kezelő metódusra.

Kód konfigurálása elemzéshez

A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.

Ezt a beállítást konfigurálhatja csak ehhez a szabályhoz, az összes szabályhoz, vagy az ebben a kategóriában (Tervezés) szereplő összes szabályhoz, amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.

Nem engedélyezett kivételtípusnevek

Beállíthatja, hogy mely kivételtípusok legyenek letiltva a lebukástól. Ha például meg szeretné adni, hogy a szabály a kezelőket megjelöljecatch, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:NullReferenceException

dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException

Engedélyezett típusnévformátumok a beállításértékben (a következővel |elválasztva):

  • Csak típusnév (a névvel ellátott összes szimbólumot tartalmazza, függetlenül attól, hogy milyen típust vagy névteret tartalmaz)
  • A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek előtaggalT:.

Példák:

Beállítás értéke Összegzés
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType Megegyezik a fordításban található "ExceptionType" nevű szimbólumokkal.
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 A fordításban szereplő "ExceptionType1" vagy "ExceptionType2" szimbólumokkal egyezik.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType A megadott teljes névvel egyezik meg a "ExceptionType" nevű konkrét típusokkal.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 A "ExceptionType1" és az "ExceptionType2" nevű típusokat a megfelelő teljes névvel egyezik meg.

Ezeket a beállításokat konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában (Tervezés) érvényes összes szabályra. További információ: Kódminőségi szabály konfigurációs beállításai.

Példa

Az alábbi példa egy olyan típust mutat be, amely megsérti ezt a szabályt, és egy olyan típust, amely megfelelően implementálja a catch blokkot.

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: Újrafedés a verem részleteinek megőrzése érdekében