CA1065: Geen uitzonderingen genereren op onverwachte locaties
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA1065 |
Titel | Geen uitzonderingen genereren op onverwachte locaties |
Categorie | Ontwerpen |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een methode die naar verwachting geen uitzonderingen genereert, genereert een uitzondering.
Beschrijving van regel
Methoden die naar verwachting geen uitzonderingen genereren, kunnen als volgt worden gecategoriseerd:
- Methoden voor ophalen van eigenschappen
- Methoden voor gebeurtenistoegang
- Is gelijk aan methoden
- GetHashCode-methoden
- ToString-methoden
- Statische constructors
- Finalizers
- Methoden verwijderen
- Gelijkheidsoperators
- Impliciete cast-operators
In de volgende secties worden deze methodetypen besproken.
Methoden voor ophalen van eigenschappen
Eigenschappen zijn in feite slimme velden. Daarom moeten ze zich zo veel mogelijk gedragen als een veld. Velden genereren geen uitzonderingen en mogen geen eigenschappen hebben. Als u een eigenschap hebt die een uitzondering genereert, kunt u overwegen deze een methode te maken.
De volgende uitzonderingen kunnen worden gegenereerd vanuit een get-methode voor eigenschappen:
- System.InvalidOperationException en alle derivaten (inclusief System.ObjectDisposedException)
- System.NotSupportedException en alle derivaten
- System.ArgumentException (alleen van geïndexeerde get)
- System.Collections.Generic.KeyNotFoundException (alleen van geïndexeerde get)
Methoden voor gebeurtenistoegang
Gebeurtenistoegangsors moeten eenvoudige bewerkingen zijn die geen uitzonderingen genereren. Een gebeurtenis mag geen uitzondering genereren wanneer u een gebeurtenis-handler probeert toe te voegen of te verwijderen.
De volgende uitzonderingen kunnen worden gegenereerd vanuit een gebeurtenistoegangsfunctie:
- System.InvalidOperationException en alle derivaten (inclusief System.ObjectDisposedException)
- System.NotSupportedException en alle derivaten
- System.ArgumentException en derivaten
Is gelijk aan methoden
De volgende equals-methoden mogen geen uitzonderingen genereren:
Een Equals
methode moet een uitzondering retourneren true
of false
in plaats van een uitzondering te genereren. Als Equals
er bijvoorbeeld twee niet-overeenkomende typen worden doorgegeven, moet deze alleen worden geretourneerd false
in plaats van een ArgumentException.
GetHashCode-methoden
De volgende GetHashCode
methoden mogen meestal geen uitzonderingen genereren:
GetHashCode
moet altijd een waarde retourneren. Anders kunt u items in de hash-tabel verliezen.
De versies van GetHashCode
die een argument kunnen een ArgumentException. Object.GetHashCode
Mag echter nooit een uitzondering genereren.
ToString-methoden
Het foutopsporingsprogramma gebruikt System.Object.ToString om informatie over objecten in tekenreeksindeling weer te geven. ToString
Wijzig daarom niet de status van een object en mag geen uitzonderingen genereren.
Statische constructors
Als u uitzonderingen van een statische constructor genereert, wordt het type onbruikbaar in het huidige toepassingsdomein. U moet een goede reden hebben (zoals een beveiligingsprobleem) voor het genereren van een uitzondering van een statische constructor.
Finalizers
Als u een uitzondering van een finalizer genereert, mislukt de CLR snel, waardoor het proces wordt afgebroken. Vermijd daarom het genereren van uitzonderingen in een finalizer.
Methoden verwijderen
Een System.IDisposable.Dispose methode mag geen uitzondering genereren. Dispose
wordt vaak aangeroepen als onderdeel van de opschoonlogica in een finally
component. Het expliciet genereren van een uitzondering van Dispose
dwingt de gebruiker daarom om uitzonderingsafhandeling toe te voegen in de finally
component.
Het Dispose(false)
codepad mag nooit uitzonderingen genereren, omdat Dispose
bijna altijd vanuit een finalizer wordt aangeroepen.
Gelijkheidsoperators (=, !=)
Net als Equals
bij methoden moeten gelijkheidsoperators ofwel ofwel true
false
, en mogen er geen uitzonderingen worden gegooid.
Impliciete cast-operators
Omdat de gebruiker vaak niet weet dat een impliciete cast-operator is aangeroepen, is een uitzondering die wordt gegenereerd door de impliciete cast-operator onverwacht. Daarom mogen er geen uitzonderingen worden gegenereerd van impliciete cast-operators.
Schendingen oplossen
Voor eigenschaps getters wijzigt u de logica zodat deze geen uitzondering meer hoeft te genereren of wijzigt u de eigenschap in een methode.
Voor alle andere methodetypen die eerder worden vermeld, wijzigt u de logica zodat deze geen uitzondering meer mag genereren.
Wanneer waarschuwingen onderdrukken
Als de schending is veroorzaakt door een uitzonderingsdeclaratie in plaats van een gegenereerde uitzondering, is het veilig om een waarschuwing van deze regel te onderdrukken.
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 CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065
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.CA1065.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.