Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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)
{
}
}