CA1064: Wyjątki powinny być publiczne
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1064 |
Tytuł | Wyjątki powinny być publiczne |
Kategoria | Projekt |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | 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)
{
}
}