CA2201: Skapa inte reserverade undantagstyper

Egenskap Värde
Regel-ID CA2201
Title Skapa inte reserverade undantagstyper
Kategori Användning
Korrigeringen är antingen invasiv eller icke-invasiv Avbrott
Aktiverad som standard i .NET 10 Nej
Tillämpliga språk C# och Visual Basic

Orsak

En metod kastar en undantagstyp som är för generell eller som är reserverad av runtime.

Regelbeskrivning

Följande undantagstyper är för allmänna för att ge användaren tillräcklig information:

Följande undantagstyper är reserverade och bör endast genereras av den vanliga språkkörningen:

Kasta inte allmänna undantag

Om du genererar en allmän undantagstyp, till exempel Exception eller SystemException, i ett bibliotek eller ramverk, tvingar det konsumenterna att fånga upp alla undantag, inklusive okända undantag som de inte vet hur de ska hantera.

I stället genererar du antingen en mer härledd typ som redan finns i ramverket eller skapar en egen typ som härleds från Exception.

Generera specifika undantag

I följande tabell visas vilket undantag som ska utlösas för olika typer av ogiltiga argument, inklusive värdeparametern i set egenskapens accessor.

Argumentet är ogiltigt Undantag
null hänvisning ArgumentNullException
Utanför det tillåtna intervallet med värden (till exempel ett index för en samling eller lista) ArgumentOutOfRangeException
Ogiltigt enum värde InvalidEnumArgumentException
Innehåller ett format som inte uppfyller parameterspecifikationerna för en metod (till exempel formatsträngen för ToString(String)) FormatException
Annars ogiltigt ArgumentException

I följande tabell visas vilket undantag som ska utlösas för olika typer av ogiltiga åtgärder.

Ogiltig åtgärd Undantag
Åtgärden är ogiltig för det aktuella tillståndet för ett objekt. InvalidOperationException
Åtgärden utförs på ett objekt som har tagits bort. ObjectDisposedException
Åtgärden stöds inte (till exempel i en åsidosätts Stream.Write i en ström som öppnats för läsning). NotSupportedException
Konverteringen skulle resultera i ett överflöd (till exempel i en explicit överbelastning av omvandlingsoperatorer). OverflowException

För alla andra situationer bör du överväga att skapa en egen typ som härleds från Exception och släng den.

Så här åtgärdar du överträdelser

Om du vill åtgärda en överträdelse av den här regeln ändrar du typen av undantaget som genereras till en viss typ som inte är en av de reserverade typerna.

Example

// This code violates the rule.
throw new Exception();
throw new NullReferenceException();
throw new IndexOutOfRangeException();
// ...

// This code satisfies the rule.
throw new ArgumentException();
throw new ArgumentNullException();
throw new InvalidOperationException();
// ...

// A minimal implementation of inheritance from Exception
public class CustomException : Exception { }

// Or create your own type that derives from Exception
// This code satisfies the rule too.
throw new CustomException();

När du ska ignorera varningar

Ignorera inte en varning från den här regeln.