다음을 통해 공유


CA1064: 예외는 public이어야 합니다.

TypeName

ExceptionsShouldBePublic

CheckId

CA1064

범주

Microsoft.Design

변경 수준

주요 변경 아님

원인

Exception, SystemException 또는 ApplicationException에서 직접 public이 아닌 예외가 파생됩니다.

규칙 설명

내부 예외는 내부 범위 내에만 표시됩니다. 예외가 내부 범위 밖에 놓이게 되면 예외를 catch하는 데 기본 예외만 사용할 수 있습니다. Exception, SystemException 또는 ApplicationException에서 내부 예외가 상속되는 경우 외부 코드에는 예외 시 수행할 작업에 대한 충분한 정보가 없습니다.

그러나 나중에 내부 예외의 기본으로 사용되는 public 예외가 코드에 있는 경우에는 이 코드에서 이후에 기본 예외로 인텔리전트한 작업을 수행할 수 있을 것으로 간주합니다. public 예외에는 T:System.Exception, T:System.SystemException 또는 T:System.ApplicationException에서 제공하는 것보다 자세한 정보가 있습니다.

위반 문제를 해결하는 방법

예외를 public 예외로 만들거나, Exception, SystemException 또는 ApplicationException이 아닌 public 예외에서 내부 예외를 파생시킵니다.

경고를 표시하지 않는 경우

모든 경우에 private 예외를 내부 범위 내에서 catch하게 될 경우 이 규칙에서 메시지를 표시하지 말아야 합니다.

예제

이 규칙은 예외 클래스가 직접 예외에서 파생되고 내부에 있기 때문에 첫 번째 예제 메서드인 FirstCustomException에서 발생합니다. 또한 직접 예외에서 클래스가 파생되기도 하지만 클래스가 public으로 선언되기 때문에 규칙이 SecondCustomException 클래스에서 발생하지 않습니다. 또한 세 번째 클래스에서는 직접 System.Exception System.SystemException 또는 System.ApplicationException에서 파생되지 않으므로 규칙이 발생하지 않습니다.

using System;
using System.Runtime.Serialization;

namespace Samples
{
    // Violates this rule
    [Serializable]
    internal class FirstCustomException : Exception
    {
        internal FirstCustomException()
        {
        }

        internal FirstCustomException(string message)
            : base(message)
        {
        }

        internal FirstCustomException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

        protected FirstCustomException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
    }

    // Does not violate this rule because
    // SecondCustomException is public
    [Serializable]
    public class SecondCustomException : Exception
    {
        public SecondCustomException()
        {
        }

        public SecondCustomException(string message)
            : base(message)
        {

        }

        public SecondCustomException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

        protected SecondCustomException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
    }

    // Does not violate this rule because
    // ThirdCustomException it does not derive directly from
    // Exception, SystemException, or ApplicationException
    [Serializable]
    internal class ThirdCustomException : SecondCustomException
    {
        internal ThirdCustomException()
        {
        }

        internal ThirdCustomException(string message)
            : base(message)
        {
        }

        internal ThirdCustomException(string message, Exception innerException)
            : base(message, innerException)
        {
        }


        protected ThirdCustomException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
    }
}