Partager via


CA1031 : Ne pas intercepter des types d'exception générale

TypeName

DoNotCatchGeneralExceptionTypes

CheckId

CA1031

Catégorie

Microsoft.CSharp

Modification avec rupture

Modification sans rupture

Cause

Une exception générale telle que Exception ou SystemException est intégrée dans une instruction catch, ou une clause catch générale telle que catch() est utilisée.

Description de la règle

Les exceptions générales ne doivent pas être interceptées.

Comment corriger les violations

Pour corriger une violation de cette règle, interceptez une exception plus spécifique ou levez à nouveau l'exception générale en tant que dernière instruction dans le bloc catch.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.L'interception de types d'exceptions génériques peut masquer des problèmes de runtime de la part de l'utilisateur de la bibliothèque et peut rendre le débogage plus difficile.

[!REMARQUE]

En commençant par .NET Framework 4, le Common Langage Runtime (CLR) ne fournit plus d'exceptions d'état endommagé qui se produisent dans le système d'exploitation et le code managé, tels que les violations d'accès dans Windows, pour être gérées par le code managé.Si vous souhaitez compiler une application dans le .NET Framework 4 ou version ultérieure et maintenir la gestion d'exceptions d'état corrompu, vous pouvez appliquer l'attribut HandleProcessCorruptedStateExceptionsAttribute à la méthode qui gère l'exception d'état endommagé.

Exemple

L'exemple suivant présente un type qui viole cette règle et un type qui implémentent correctement le bloc catch.

Imports System
Imports System.IO

Namespace DesignLibrary

    ' 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)
            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
using System;
using System.IO;

namespace DesignLibrary
{
    // 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 e)
            {
                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 e)
            {
                Console.WriteLine("Unable to open {0}.", inFile);
            }

            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;
            }
        }
    }
}
using namespace System;
using namespace System::IO;

namespace DesignLibrary
{
    // Creates two violations of the rule. 
    public ref class GenericExceptionsCaught
    {
        FileStream^ inStream;
        FileStream^ outStream;

    public:
        GenericExceptionsCaught(String^ inFile, String^ outFile)
        {
            try
            {
                inStream = File::Open(inFile, FileMode::Open);
            }
            catch(SystemException^ e)
            {
                Console::WriteLine("Unable to open {0}.", inFile);
            }

            try
            {
                outStream = File::Open(outFile, FileMode::Open);
            }
            catch(Exception^ e)
            {
                Console::WriteLine("Unable to open {0}.", outFile);
            }
        }
    };

    public ref 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^ e)
            {
                Console::WriteLine("Unable to open {0}.", inFile);
            }

            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(Exception^ e)
            {
                Console::WriteLine("Unable to open {0}.", outFile);
                throw;
            }
        }
    };
}

Règles connexes

CA2200 : Levez à nouveau une exception pour conserver les détails de la pile