Sdílet prostřednictvím


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

Vlastnost Hodnota
ID pravidla CA1064
Název Výjimky by měly být veřejné
Kategorie Návrh
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Neveřejná výjimka je odvozena přímo z Exception, SystemExceptionnebo ApplicationException.

Popis pravidla

Vnitřní výjimka je viditelná pouze uvnitř vlastního interního oboru. Jakmile výjimka přesáhne hranice vnitřního rozsahu, lze pro zachycení výjimky použít pouze základní výjimku. Pokud je vnitřní výjimka zděděna z Exception, SystemExceptionnebo ApplicationException, externí kód nebude mít dostatek informací vědět, co dělat s výjimkou.

Pokud má ale kód veřejnou výjimku, která se později použije jako základ pro interní výjimku, je vhodné předpokládat, že kód dále bude schopen provést něco inteligentního s základní výjimkou. Veřejná výjimka bude obsahovat více informací, než jaké poskytuje Exception, SystemExceptionnebo ApplicationException.

Jak opravit porušení

Zpřístupnit výjimku nebo odvodit vnitřní výjimku z veřejné výjimky, která není Exception, SystemExceptionnebo ApplicationException.

Kdy potlačit upozornění

Pokud jste si jistí, že soukromá výjimka bude zachycena ve vlastním interním oboru, potlačit zprávu z tohoto pravidla.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklad

Toto pravidlo se aktivuje u první ukázkové metody FirstCustomException, protože třída výjimky je odvozena přímo z Exception a je interní. Pravidlo se neaktivuje u třídy SecondCustomException, protože i když třída je také odvozena přímo z Exception, třída je deklarována jako veřejná. Třetí třída také neaktivuje pravidlo, protože není odvozeno přímo z System.Exception, System.SystemExceptionnebo 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)
    {
    }
}