Dela via


CA1065: Skapa inte undantag på oväntade platser

Egenskap Värde
Regel-ID CA1065
Title Skapa inte undantag på oväntade platser
Kategori Design
Korrigeringen är antingen invasiv eller icke-invasiv Oumbrytbar
Aktiverad som standard i .NET 10 Nej
Tillämpliga språk C# och Visual Basic

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:

  • Metoder för att få egenskaper
  • Metoder för händelseåtkomst
  • Lika med metoder
  • GetHashCode-metoder
  • ToString-metoder
  • Statiska konstruktorer
  • Finalisatorer
  • Metoder för bortskaffning
  • Likhetsoperatorer
  • Implicita typkonverteringsoperatorer

I följande avsnitt beskrivs dessa metodtyper.

Metoder för att hämta egenskaper

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 det bör inte egenskaper heller. 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 en property:

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 Equals-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 till exempel Equals skickas två oförenliga typer ska det bara returnera 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 som tar ett argument kan kasta en ArgumentException. Dock bör 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.

Finalisatorer

Om du utlöser ett undantag från en finalizer misslyckas CLR snabbt, vilket river ner processen. Undvik därför att generera undantag i en finaliserare.

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 tvingas användaren uttryckligen att lägga till undantagshantering i finally-satsen genom utlösen av ett undantag från Dispose.

Kodsökvägen Dispose(false) bör aldrig utlösa undantag eftersom Dispose 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 typkonverteringsoperatorer

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 utlöst undantag är det säkert att undertrycka en varning från denna regel.

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