Condividi tramite


CA1064: Le eccezioni devono essere pubbliche

TypeName

ExceptionsShouldBePublic

CheckId

CA1064

Category

Microsoft.Design

Breaking Change

Non sostanziale

Causa

Un'eccezione non pubblica deriva direttamente da Exception, SystemException o ApplicationException.

Descrizione della regola

Un'eccezione interna è visibile solo nel relativo ambito interno.Se l'eccezione si verifica al di fuori dell'ambito interno, può essere rilevata solo tramite l'eccezione di base.Se l'eccezione interna è ereditata da Exception, SystemException o ApplicationException, il codice esterno non disporrà di informazioni sufficienti per la corretta gestione dell'eccezione.

Se invece nel codice è presente un'eccezione pubblica utilizzata in seguito come base per un'eccezione interna, è ragionevole supporre che il codice più esterno sarà in grado di gestire in modo più opportuno l'eccezione di base.All'eccezione pubblica saranno associate maggiori informazioni rispetto a quelle fornite da T:System.Exception, T:System.SystemException o T:System.ApplicationException.

Come correggere le violazioni

Rendere pubblica l'eccezione o derivare l'eccezione interna da un'eccezione pubblica diversa da Exception, SystemException o ApplicationException.

Esclusione di avvisi

Escludere un messaggio da questa regola se si è certi che, in qualsiasi caso, l'eccezione privata sarà rilevata nel relativo ambito interno.

Esempio

Questa regola si attiva nel primo metodo di esempio, FirstCustomException, perché la classe dell'eccezione deriva direttamente da Exception ed è interna.La regola non viene eseguita nella classe SecondCustomException perché, sebbene anche la classe derivi direttamente da Exception, la classe viene dichiarata pubblica.Anche la terza classe non attiva la regola perché non deriva direttamente da Exception, SystemException o 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)
        {
        }
    }
}