CA1064: Wyjątki powinny być publiczne

Właściwości Wartość
Identyfikator reguły CA1064
Stanowisko Wyjątki powinny być publiczne
Kategoria Projekt
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Wyjątek niepubliki pochodzi bezpośrednio z Exceptionelementu , SystemExceptionlub 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ż podane przez Exceptionelement , SystemExceptionlub ApplicationException.

Jak naprawić naruszenia

Udostępnij wyjątek publicznie lub utwórz wyjątek wewnętrzny z wyjątku publicznego, który nie Exceptionjest , SystemExceptionlub ApplicationException.

Kiedy pomijać ostrzeżenia

Pomiń komunikat z tej reguły, jeśli masz pewność, że wyjątek prywatny zostanie przechwycony we 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 w klasie SecondCustomException, ponieważ mimo że klasa również pochodzi bezpośrednio z wyjątku, klasa jest zadeklarowana publicznie. 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)
    {
    }
}