CA1064: Undantag bör vara offentliga
Property | Värde |
---|---|
Regel-ID | CA1064 |
Title | Undantag bör vara offentliga |
Kategori | Designa |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
Ett icke-offentligt undantag härleds direkt från Exception, SystemExceptioneller ApplicationException.
Regelbeskrivning
Ett internt undantag visas bara inom det egna interna omfånget. När undantaget ligger utanför det interna omfånget kan endast basfelet användas för att fånga undantaget. Om det interna undantaget ärvs från Exception, SystemExceptioneller ApplicationException, har den externa koden inte tillräcklig information för att veta vad du ska göra med undantaget.
Men om koden har ett offentligt undantag som senare används som bas för ett internt undantag är det rimligt att anta att koden längre ut kommer att kunna göra något intelligent med basfelet. Det offentliga undantaget har mer information än vad som tillhandahålls av Exception, SystemExceptioneller ApplicationException.
Så här åtgärdar du överträdelser
Gör undantaget offentligt eller härled det interna undantaget från ett offentligt undantag som inte Exceptionär , SystemExceptioneller ApplicationException.
När du ska ignorera varningar
Ignorera ett meddelande från den här regeln om du i alla fall är säker på att det privata undantaget fångas inom dess egna interna omfång.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1064
// The code that's violating the rule is on this line.
#pragma warning restore CA1064
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1064.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel
Den här regeln utlöses på den första exempelmetoden FirstCustomException eftersom undantagsklassen härleds direkt från Undantag och är intern. Regeln utlöses inte på klassen SecondCustomException eftersom klassen även om den också härleds direkt från Undantag, deklareras klassen som offentlig. Den tredje klassen utlöses inte heller regeln eftersom den inte härleds direkt från System.Exception, System.SystemExceptioneller 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)
{
}
}