CA1064:异常应该是公共的

类型名

ExceptionsShouldBePublic

CheckId

CA1064

类别

Microsoft.Design

是否重大更改

原因

非公共异常直接从 ExceptionSystemExceptionApplicationException 派生。

规则说明

内部异常仅在其自己的内部范围内可见。 当异常超出内部范围后,只能使用基异常来捕获该异常。 如果内部异常是从 ExceptionSystemExceptionApplicationException 继承的,外部代码将没有足够的信息了解如何处理该异常。

但是,如果代码具有一个公共异常,该异常随后被用作内部异常的基异常,那么有理由假定代码将来可以对基异常执行某些智能操作。 公共异常将获得比 T:System.Exception、T:System.SystemException 或 T:System.ApplicationException 提供的信息更多的信息。

如何解决冲突

使异常成为公共异常,或者从除 ExceptionSystemExceptionApplicationException 之外的公共异常派生内部异常。

何时禁止显示警告

如果您确定在任何情况下私有异常都将在其自己的内部范围内被捕获,则可以禁止显示有关此规则的消息。

示例

因为异常类直接派生自异常,而且是内部的,所以此规则会在第一个示例方法 FirstCustomException 上激发。 该规则不会在 SecondCustomException 类上触发,这是因为虽然也直接从异常中派生类,该类仍被声明为公共。 第三类也不会触发该规则,因为它不能直接从 System.ExceptionSystem.SystemExceptionSystem.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)
        {
        }
    }
}