다음을 통해 공유


CA1031: 일반적인 예외 형식을 catch하지 마십시오.

TypeName

DoNotCatchGeneralExceptionTypes

CheckId

CA1031

범주

Microsoft.Design

변경 수준

주요 변경 아님

원인

Exception 또는 SystemException과 같은 일반 예외가 catch 문에서 catch되거나 catch()와 같은 일반 catch 절이 사용되었습니다.

규칙 설명

일반 예외는 catch하면 안 됩니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 보다 구체적인 예외를 catch하거나 일반 예외를 catch 블록의 마지막 문으로 다시 throw합니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시해야 합니다.일반 예외 형식을 catch하면 런타임 문제가 라이브러리 사용자에게 표시되지 않고 디버깅이 복잡해질 수 있습니다.

[!참고]

.NET Framework 4로 시작하는, 공용 언어 런타임 (CLR)은 운영 체제에서 발생하는 손상된 상태와 Windows 에서 액세스를 위반하는 관리 코드를 더 이상 제공하지 않고 관리코드에 의해 처리됩니다..NET Framework 4 에서 응용 프로그램을 컴파일할 경우 또는 상태 예외 처리를 다루는 것을 지속하면, 상태 예외를 다루는 메서드에 HandleProcessCorruptedStateExceptionsAttribute 을 적용할 수 있습니다.

예제

다음 예제에서는 이 규칙을 위반하는 형식과 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;
            }
        }
    };
}

관련 규칙

CA2200: 스택 정보를 유지하도록 다시 throw하십시오.