Udostępnij za pośrednictwem


CA1031: Nie przechwytuj wyjątków typów ogólnych

TypeName

DoNotCatchGeneralExceptionTypes

CheckId

CA1031

Kategoria

Microsoft.Design

Zmiana kluczowa

Niekluczowa

Przyczyna

Ogólny wyjątek, taki jak Exception lub SystemException został przechwycony przez instrukcję catch, lub ogólna klauzula catch, taka jak catch() jest używana.

Opis reguły

Ogólne wyjątki nie powinny być przechwytywane.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy przechwytywać bardziej szczegółowy wyjątek, lub ponownie zgłosić ogólny wyjątek w ostatniej instrukcji w bloku catch.

Kiedy pominąć ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.Przechwytywanie ogólnego typu wyjątku może ukryć problemy w czasie wykonywania biblioteki użytkownika i może utrudnić debugowanie.

[!UWAGA]

Począwszy od Program .NET Framework 4, środowisko uruchomieniowe języka wspólnego (CLR) nie dostarcza już wyjątków uszkodzonych stanów, które występują w systemie operacyjnym i kodzie zarządzanym, takich jak naruszenia praw dostępu w systemie Windows, obsługiwanych przez kod zarządzany.Jeśli chcesz skompilować aplikację w Program .NET Framework 4 lub nowszym i utrzymać obsługę wyjątków stanów uszkodzonych, można zastosować atrybut HandleProcessCorruptedStateExceptionsAttribute do metody, która obsługuje wyjątek stanu uszkodzonego.

Przykład

Poniższy przykład pokazuje typ, który narusza reguły i typ, który poprawnie implementuje blok 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;
            }
        }
    };
}

Powiązane reguły

CA2200: Należy zgłosić ponownie, aby zachować szczegóły stosu