CA1064: Wyjątki powinny być publiczne

Właściwości Wartość
Identyfikator reguły CA1064
Tytuł Wyjątki powinny być publiczne
Kategoria Projektowanie
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

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

Opis reguły

Wyjątek wewnętrzny jest widoczny tylko wewnątrz własnego zakresu wewnętrznego. W przypadku wystąpienia wyjątku poza zakresem wewnętrznym tylko wyjątek podstawowy może zostać użyty do jego przechwycenia. Jeśli wyjątek wewnętrzny jest dziedziczony z Exception, SystemExceptionlub ApplicationException, kod zewnętrzny nie będzie miał wystarczających informacji, aby wiedzieć, co zrobić z wyjątkiem.

Jeśli jednak kod ma wyjątek publiczny, który później jest używany jako podstawa wyjątku wewnętrznego, uzasadnione jest założenie, że kod dalej będzie mógł zrobić coś inteligentnego z wyjątkiem podstawowym. Wyjątek publiczny będzie zawierać więcej informacji niż dostarczone przez Exceptionelement, SystemException lub ApplicationException.

Jak naprawić naruszenia

Udostępnij wyjątek publicznie lub wyprowadź wyjątek wewnętrzny z wyjątku publicznego, który nie jest Exception, SystemException lub ApplicationException.

Kiedy pomijać ostrzeżenia

Zablokuj komunikat z tej reguły, jeśli masz pewność w każdym przypadku, że wyjątek prywatny zostanie przechwycony w jego własnym zakresie wewnętrznym.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykład

Ta reguła jest uruchamiana w pierwszej przykładowej metodzie FirstCustomException, ponieważ klasa wyjątków pochodzi bezpośrednio z wyjątku i jest wewnętrzna. Reguła nie jest uruchamiana dla klasy SecondCustomException, ponieważ chociaż klasa również dziedziczy bezpośrednio z klasy Exception, jest zadeklarowana jako publiczna. Trzecia klasa również nie uruchamia reguły, ponieważ nie pochodzi bezpośrednio z System.Exception, System.SystemExceptionlub 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)
    {
    }
}