Sdílet prostřednictvím


CA1064: Výjimky by měly být veřejné

TypeName

ExceptionsShouldBePublic

CheckId

CA1064

Kategorie

Microsoft.Design

Narušující změna

Nenarušující

Příčina

Neveřejná výjimka je přímo odvozená z výjimky Exception, SystemException, nebo ApplicationException.

Popis pravidla

Interní výjimka je viditelná pouze uvnitř svého vlastního vnitřního rozsahu.Jakmile výjimka přesáhne hranice vnitřního rozsahu, lze pro zachycení výjimky použít pouze základní výjimku.Je-li vnitřní výjimka odvozena ze třídy Exception, SystemException nebo ApplicationException, externí kód nebude mít dostatek informací pro její zpracování.

Pokud však obsahuje kód veřejnou výjimku, která později slouží jako základní třída pro vnitřní výjimku, je rozumné předpokládat, že zanořený kód bude schopný základní výjimku rozumně ošetřit.Veřejné výjimka bude obsahovat více informací než poskytují výjimky T:System.Exception, T:System.SystemException, nebo T:System.ApplicationException.

Jak vyřešit porušení

Převedením výjimky na veřejnou nebo odvozením vnitřní výjimky z veřejné výjimky, která není typu Exception, SystemException, ani ApplicationException.

Kdy potlačit upozornění

Potlačte zprávy tohoto pravidla jen tehdy, pokud je soukromá výjimka opravdu ve všech případech ošetřena ve svém vnitřním rozsahu.

Příklad

Toto pravidlo je vyvoláno v prvním metodě příkladu FirstCustomException, protože třída výjimky pochází přímo z třídy Exception a je deklarována jako vnitřní.Pravidlo není vyvoláno na třídě SecondCustomException, protože, i když je třída přímo odvozena od třídy Exception, je deklarována jako veřejná.Třetí třída také nevyvolá toto pravidlo, protože není odvozena přímo z třídy Exception, SystemException, nebo 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)
        {
        }
    }
}