Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA1064 |
| Titel | Uitzonderingen moeten openbaar zijn |
| Categorie | Ontwerpen |
| Fix kan brekend of niet-brekend zijn | Niet-brekend |
| Standaard ingeschakeld in .NET 10 | Nee |
| Toepasselijke talen | C# en Visual Basic |
Oorzaak
Een niet-openbare uitzondering is rechtstreeks afgeleid van Exception, SystemExceptionof ApplicationException.
Beschrijving van regel
Een interne uitzondering is alleen zichtbaar binnen een eigen intern bereik. Nadat de uitzondering buiten het interne bereik valt, kan alleen de basisonderzondering worden gebruikt om de uitzondering te ondervangen. Als de interne uitzondering wordt overgenomen van Exception, SystemExceptionof ApplicationException, beschikt de externe code niet over voldoende informatie om te weten wat er met de uitzondering moet worden uitgevoerd.
Maar als de code een publieke uitzondering heeft die later als basis voor een interne uitzondering wordt gebruikt, is het redelijk om aan te nemen dat de omringende code iets verstandigs kan doen met de onderliggende uitzondering. De openbare uitzondering bevat meer informatie dan wordt verstrekt door Exception, SystemExceptionof ApplicationException.
Hoe schendingen op te lossen
Maak de uitzondering openbaar of leid de interne uitzondering af van een openbare uitzondering die niet Exception, SystemExceptionof ApplicationException.
Wanneer waarschuwingen onderdrukken
Onderdrukt een bericht van deze regel als u zeker weet dat de privéuitzondering binnen een eigen intern bereik valt.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA1064
// The code that's violating the rule is on this line.
#pragma warning restore CA1064
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA1064.severity = none
Zie voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.
Voorbeeld
Deze regel wordt geactiveerd op de eerste voorbeeldmethode FirstCustomException, omdat de uitzonderingsklasse rechtstreeks is afgeleid van Uitzondering en intern is. De regel wordt niet geactiveerd op de klasse SecondCustomException, omdat de klasse weliswaar ook direct van Exception is afgeleid, maar openbaar is verklaard. De derde klasse ontslaat de regel ook niet omdat deze niet rechtstreeks is afgeleid van System.Exception, System.SystemExceptionof 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)
{
}
}