共用方式為


CA1064:例外狀況必須是公用

型別名稱

ExceptionsShouldBePublic

CheckId

CA1064

分類

Microsoft.Design

中斷變更

不中斷

原因

非公用例外狀況 (Exception) 是直接衍生自 ExceptionSystemExceptionApplicationException

規則描述

內部例外狀況只會在自己的內部範圍內顯示。當例外狀況超出內部範圍後,只能使用基本例外狀況來攔截例外狀況。如果內部例外狀況是繼承自 ExceptionSystemExceptionApplicationException,外部程式碼就沒有足夠的資訊可以知道應該如何處理此例外狀況。

但是,如果程式碼有公用的 (Public) 例外狀況可於稍後當做內部例外狀況的基底,則可合理假設程式碼此後將可對此基底例外狀況採取適當的處理方式。公用例外狀況擁有的資訊將比 T:System.Exception、T:System.SystemException 或 T:System.ApplicationException 更為豐富。

如何修正違規

請將例外狀況變成公用例外狀況,或是從 ExceptionSystemExceptionApplicationException 以外的其他公用例外狀況衍生內部例外狀況。

隱藏警告的時機

如果您確定在所有情況下,私用的例外狀況都會在自己的內部範圍內遭到攔截,請隱藏這項規則的訊息。

範例

這個規則會在第一個範例方法 (FirstCustomException) 引發,因為例外狀況類別是直接衍生例外狀況及其內部。規則不會在 SecondCustomException 類別引發,因為雖然該類別也直接衍生自例外狀況,但卻已宣告為公用第三個類別也不會引發規則,因為它不是直接從 ExceptionSystemExceptionApplicationException 衍生的。

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)
        {
        }
    }
}