Freigeben über


CA1064: Ausnahmen sollten öffentlich sein

TypeName

ExceptionsShouldBePublic

CheckId

CA1064

Kategorie

Microsoft.Design

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Eine nicht öffentliche Ausnahme wird direkt von Exception, SystemException oder ApplicationException abgeleitet.

Regelbeschreibung

Eine interne Ausnahme ist nur innerhalb ihres eigenen internen Bereichs sichtbar.Nachdem die Ausnahme den internen Bereich verlassen hat, kann nur die Basisausnahme zum Abfangen der Ausnahme verwendet werden.Wenn die interne Ausnahme von Exception, SystemException oder ApplicationException geerbt wurde, verfügt der externe Code nicht über genügend Informationen zur Behandlung der Ausnahme.

Wenn im Code jedoch eine öffentliche Ausnahme enthalten ist, die später als Basis für eine interne Ausnahme verwendet wird, kann zweifellos davon ausgegangen werden, dass der weiter außen liegende Code in der Lage sein wird, die Basisausnahme auf intelligente Weise zu behandeln.Die öffentliche Ausnahme weist mehr als die von T:System.Exception, T:System.SystemException oder T:System.ApplicationException bereitgestellten Informationen auf.

Behandeln von Verstößen

Wandeln Sie die Ausnahme in eine öffentliche Ausnahme um, oder lassen Sie die interne Ausnahme von einer öffentlichen Ausnahme außer Exception, SystemException oder ApplicationException ableiten.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie eine Meldung dieser Regel, wenn Sie in allen Fällen sicher sind, dass die private Ausnahme innerhalb ihres eigenen internen Bereichs abgefangen wird.

Beispiel

Diese Regel wird bei der ersten Beispielmethode ausgelöst (FirstCustomException), da die Ausnahmeklasse direkt von der Ausnahme abgeleitet wird und intern ist.Die Regel wird nicht in der SecondCustomException-Klasse ausgelöst, da die Klasse ungeachtet der unmittelbaren Ableitung von der Ausnahme als öffentlich deklariert wird.Die dritte Klasse löst ebenfalls nicht die Regel aus, da sie nicht direkt von System.Exception, System.SystemException, oder System.ApplicationException abgeleitet wird.

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