CA1065: Skapa inte undantag på oväntade platser
Property | Värde |
---|---|
Regel-ID | CA1065 |
Title | Skapa inte undantag på oväntade platser |
Kategori | Designa |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En metod som inte förväntas utlösa undantag utlöser ett undantag.
Regelbeskrivning
Metoder som inte förväntas generera undantag kan kategoriseras på följande sätt:
- Get-metoder för egenskap
- Metoder för händelseåtkomst
- Lika med metoder
- GetHashCode-metoder
- ToString-metoder
- Statiska konstruktorer
- Slutförare
- Metoder för bortskaffning
- Likhetsoperatorer
- Implicita gjutna operatorer
I följande avsnitt beskrivs dessa metodtyper.
Get-metoder för egenskap
Egenskaper är i princip smarta fält. Därför bör de bete sig som ett fält så mycket som möjligt. Fält utlöser inte undantag och bör inte heller egenskaper. Om du har en egenskap som utlöser ett undantag kan du överväga att göra den till en metod.
Följande undantag kan genereras från en get-metod för egenskapen:
- System.InvalidOperationException och alla derivat (inklusive System.ObjectDisposedException)
- System.NotSupportedException och alla derivat
- System.ArgumentException (endast från indexerad get)
- System.Collections.Generic.KeyNotFoundException (endast från indexerad get)
Metoder för händelseåtkomst
Händelseåtkomster bör vara enkla åtgärder som inte utlöser undantag. En händelse bör inte utlösa ett undantag när du försöker lägga till eller ta bort en händelsehanterare.
Följande undantag kan genereras från en händelseåtkomstor:
- System.InvalidOperationException och alla derivat (inklusive System.ObjectDisposedException)
- System.NotSupportedException och alla derivat
- System.ArgumentException derivat och derivat
Lika med metoder
Följande lika med-metoder bör inte utlösa undantag:
En Equals
metod bör returnera true
eller false
i stället för att utlösa ett undantag. Om Equals
det till exempel skickas två felmatchade typer bör det bara returneras false
i stället för att kasta en ArgumentException.
GetHashCode-metoder
Följande GetHashCode
metoder bör vanligtvis inte utlösa undantag:
GetHashCode
ska alltid returnera ett värde. Annars kan du förlora objekt i hash-tabellen.
Versionerna av GetHashCode
det tar ett argument kan utlösa en ArgumentException. Bör dock Object.GetHashCode
aldrig utlösa ett undantag.
ToString-metoder
Felsökningsprogrammet använder System.Object.ToString för att visa information om objekt i strängformat. ToString
Därför bör inte ändra tillståndet för ett objekt, och det bör inte utlösa undantag.
Statiska konstruktorer
Om du utlöser undantag från en statisk konstruktor blir typen oanvändbar i den aktuella programdomänen. Du bör ha en bra anledning (till exempel ett säkerhetsproblem) för att utlösa ett undantag från en statisk konstruktor.
Slutförare
Om du utlöser ett undantag från en finalizer misslyckas CLR snabbt, vilket river ner processen. Undvik därför att utlösa undantag i en finalizer.
Metoder för bortskaffning
En System.IDisposable.Dispose metod bör inte utlösa ett undantag. Dispose
anropas ofta som en del av rensningslogik i en finally
-sats. Därför tvingar uttryckligen utlösen av ett undantag från Dispose
användaren att lägga till undantagshantering i finally
-satsen.
Kodsökvägen Dispose(false)
bör aldrig utlösa undantag eftersom Dispose
den nästan alltid anropas från en finalizer.
Likhetsoperatorer (==, !=)
Precis som Equals
metoder bör likhetsoperatorer returnera antingen true
eller false
, och bör inte utlösa undantag.
Implicita gjutna operatorer
Eftersom användaren ofta inte känner till att en implicit cast-operator har anropats, är ett undantag som genereras av den implicita cast-operatorn oväntat. Därför bör inga undantag genereras från implicita cast-operatorer.
Så här åtgärdar du överträdelser
För egenskapsmottagare ändrar du antingen logiken så att den inte längre behöver utlösa ett undantag eller ändra egenskapen till en metod.
För alla andra metodtyper som anges tidigare ändrar du logiken så att den inte längre får utlösa ett undantag.
När du ska ignorera varningar
Om överträdelsen orsakades av en undantagsdeklaration i stället för ett undantagsfel är det säkert att ignorera en varning från den här regeln.
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 CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065
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.CA1065.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.