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


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

Tulajdonság Érték
Szabályazonosító CA1031
Cím Ne kezelje az általános kivételtípusokat
Kategória Tervezés
A javítás okoz problémát, vagy nem okoz problémát Nem törés
Alapértelmezés szerint engedélyezve a .NET 9-ben Nem

Ok

Egy általános kivétel, mint például System.Exception vagy System.SystemException, el van kapva egy catch utasításban, vagy egy általános fogási záradék, mint például catch(), van használatban.

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

Az általános kivételeket nem szabad elkapni.

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.

Elemzéshez konfigurált kód

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 ne legyenek elfogva. Ha például meg szeretné adni, hogy a szabály a catch kezelőket NullReferenceException megjelölje, adja hozzá a következő kulcs-érték párost a projekt egyik .editorconfig fájljához.

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 Megfelel a fordítás során található "ExceptionType" nevű szimbólumoknak.
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 A fordítás során az "ExceptionType1" vagy az "ExceptionType2" nevű szimbólumokkal egyezik.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType Megadott teljes névvel egyező 'ExceptionType' nevű konkrét típusokat keres.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 Az 'ExceptionType1' és 'ExceptionType2' nevű típusokat a megfelelő teljesen kvalifikált nevekkel párosítja.

Ezeket a beállításokat konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában szereplő összes szabályra (Tervezési), amelyekre vonatkoznak. 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 {inFile}.");
        }

        try
        {
            outStream = File.Open(outFile, FileMode.Open);
        }
        catch
        {
            Console.WriteLine($"Unable to open {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 {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;
        }
    }
}

CA2200: Újrafedés a verem részleteinek megőrzése érdekében