Udostępnij za pośrednictwem


CA1064: Wyjątki powinny być publiczne

TypeName

ExceptionsShouldBePublic

CheckId

CA1064

Kategoria

Microsoft.Design

Złamanie zmiany

Bez podziału

Przyczyna

Wyjątek publiczno-pochodzi bezpośrednio z Exception, SystemException, lub ApplicationException.

Opis reguły

Wewnętrzny wyjątek jest widoczna tylko wewnątrz wewnętrznego zakresu.Po wyjątku wychodzi poza zakres wewnętrznego, można tylko podstawowy wyjątek wyjątek należy przechwycić.Jeśli wyjątek wewnętrzny jest dziedziczona z Exception, SystemException, lub ApplicationException, zewnętrzny kod będzie nie posiada wystarczających informacji, aby wiedzieć, co należy zrobić z wyjątkiem.

Ale jeśli kod ma publicznych wyjątków, później używany jako podstawy dla wyjątku wewnętrznego, jest uzasadnione założono, że kod jest poza będą mogli coś inteligentnego z wyjątkiem podstawowej.Publiczne wyjątek będzie mieć więcej niż to, co jest przewidziane przez T:System.Exception, T:System.SystemException lub T:System.ApplicationException.

Jak naprawić naruszenia

Wyjątek publicznej lub pochodzić wewnętrzny wyjątek od publicznego wyjątek, który nie jest Exception, SystemException, lub ApplicationException.

Kiedy do pomijania ostrzeżenia

Komunikat od tej reguły należy pominąć, jeśli masz pewność, we wszystkich przypadkach, że prywatne wyjątek zostanie przechwycony w zakresie wewnętrznych.

Przykład

Ta reguła pożary na przykład metody pierwszego, FirstCustomException, ponieważ klasa wyjątków wynika bezpośrednio z wyjątkiem i wewnętrznych.Reguła nie ognia na klasy SecondCustomException, ponieważ chociaż klasy wynika również bezpośrednio z wyjątkiem, klasa jest zadeklarowany jako publiczny.Klasy trzeciej również nie ognia reguła, ponieważ nie pochodzi bezpośrednio z Exception, SystemException, lub 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)
        {
        }
    }
}