Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| 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:
- System.InvalidOperationException och alla derivat (inklusive System.ObjectDisposedException)
- System.NotSupportedException och alla dess 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 och derivat
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.