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 |
En metod som inte förväntas utlösa undantag utlöser ett undantag.
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.
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)
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
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.
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.
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.
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.
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.
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.
Precis som Equals
metoder bör likhetsoperatorer returnera antingen true
eller false
, och bör inte utlösa undantag.
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.
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.
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.
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.
Feedback om .NET
.NET är ett öppen källkod projekt. Välj en länk för att ge feedback: