Share via


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 8 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:

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:

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.

Se även