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)
{
}
}