Share via


CA1064: Undantag bör vara offentliga

Property Värde
Regel-ID CA1064
Rubrik Undantag bör vara offentliga
Kategori Designa
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Ett icke-offentligt undantag härleds direkt från Exception, SystemExceptioneller ApplicationException.

Regelbeskrivning

Ett internt undantag visas bara inom det egna interna omfånget. När undantaget ligger utanför det interna omfånget kan endast basfelet användas för att fånga undantaget. Om det interna undantaget ärvs från Exception, SystemExceptioneller ApplicationException, har den externa koden inte tillräcklig information för att veta vad du ska göra med undantaget.

Men om koden har ett offentligt undantag som senare används som bas för ett internt undantag är det rimligt att anta att koden längre ut kommer att kunna göra något intelligent med basfelet. Det offentliga undantaget har mer information än vad som tillhandahålls av Exception, SystemExceptioneller ApplicationException.

Så här åtgärdar du överträdelser

Gör undantaget offentligt eller härled det interna undantaget från ett offentligt undantag som inte Exceptionär , SystemExceptioneller ApplicationException.

När du ska ignorera varningar

Ignorera ett meddelande från den här regeln om du i alla fall är säker på att det privata undantaget fångas inom dess egna interna omfång.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

#pragma warning disable CA1064
// The code that's violating the rule is on this line.
#pragma warning restore CA1064

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_diagnostic.CA1064.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel

Den här regeln utlöses på den första exempelmetoden FirstCustomException eftersom undantagsklassen härleds direkt från Undantag och är intern. Regeln utlöses inte på klassen SecondCustomException eftersom klassen även om den också härleds direkt från Undantag, deklareras klassen som offentlig. Den tredje klassen utlöses inte heller regeln eftersom den inte härleds direkt från System.Exception, System.SystemExceptioneller System.ApplicationException.

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