CA2208: Vytvořte správně instance výjimky argumentu
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2208 |
Název | Vytvořte správně instance výjimky argumentu |
Kategorie | Využití |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 8 | Jako návrh |
Příčina
Pokud metoda má parametr a vyvolá typ výjimky, který je nebo je odvozen od , ArgumentExceptionje očekávána volání konstruktoru, který paramName
přijímá parametr správně. Mezi možné příčiny patří následující situace:
- Volání výchozího konstruktoru (bez parametrů) typu výjimky, který je nebo je odvozen od, který má také konstruktor, ArgumentException který přijímá
paramName
parametr. - Nesprávný argument řetězce je předán parametrizovaný konstruktor typu výjimky, který je nebo odvozen od, ArgumentException.
- Jeden z názvů parametrů je předán pro
message
argument konstruktoru typu výjimky, který je, nebo je odvozen od, ArgumentException.
Popis pravidla
Místo volání výchozí konstruktoru zavolejte jedno z přetížení konstruktoru, které umožňuje poskytnout smysluplnější zprávu o výjimce. Zpráva o výjimce by měla cílit na vývojáře a jasně vysvětlit chybovou podmínku a způsob opravy nebo zabránění výjimce.
Podpisy jednoho a dvou řetězcových konstruktorů ArgumentException a jeho odvozených typů nejsou konzistentní s ohledem na pozici message
a paramName
parametry. Ujistěte se, že tyto konstruktory jsou volány se správnými řetězcovými argumenty. Podpisy jsou následující:
ArgumentException(string message)
ArgumentException(string message, string paramName)
ArgumentNullException(string paramName)
ArgumentNullException(string paramName, string message)
ArgumentOutOfRangeException(string paramName)
ArgumentOutOfRangeException(string paramName, string message)
DuplicateWaitObjectException(string parameterName)
DuplicateWaitObjectException(string parameterName, string message)
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, zavolejte konstruktor, který přebírá zprávu, název parametru nebo obojí, a ujistěte se, že argumenty jsou správné pro typ ArgumentException volání.
Tip
Oprava kódu je k dispozici v sadě Visual Studio pro nesprávně umístěné názvy parametrů. Pokud ho chcete použít, umístěte kurzor na řádek upozornění a stiskněte ctrl+. (tečka). V zobrazeném seznamu možností zvolte Prohodit pořadí argumentů.
Pokud je metodě předán ArgumentException(String) název parametru místo zprávy, fixer místo toho poskytuje možnost přepnout na konstruktor se dvěma argumenty.
Kdy potlačit upozornění
Upozornění z tohoto pravidla je bezpečné potlačit pouze v případě, že je parametrizovaný konstruktor volán se správnými řetězcovými argumenty.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2208
// The code that's violating the rule is on this line.
#pragma warning restore CA2208
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2208.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Konfigurace kódu pro analýzu
Pomocí následující možnosti nakonfigurujte, ve kterých částech základu kódu se má toto pravidlo spouštět.
Tuto možnost můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (Návrh), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.
Zahrnutí konkrétních povrchů rozhraní API
Na základě přístupnosti můžete nakonfigurovat, na kterých částech základu kódu se má toto pravidlo spouštět. Pokud chcete například určit, že pravidlo by se mělo spouštět jenom na neveřejné ploše rozhraní API, přidejte do souboru .editorconfig v projektu následující pár klíč-hodnota:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Ve výchozím nastavení se pravidlo CA2208 vztahuje na všechny plochy rozhraní API (veřejné, interní a soukromé).
Příklad
Následující kód ukazuje konstruktor, který nesprávně vytvoří instanci instance .ArgumentNullException
public class Book
{
public Book(string title)
{
Title = title ??
throw new ArgumentNullException("All books must have a title.", nameof(title));
}
public string Title { get; }
}
Public Class Book
Private ReadOnly _Title As String
Public Sub New(ByVal title As String)
' Violates this rule (constructor arguments are switched)
If (title Is Nothing) Then
Throw New ArgumentNullException("title cannot be a null reference (Nothing in Visual Basic)", "title")
End If
_Title = title
End Sub
Public ReadOnly Property Title()
Get
Return _Title
End Get
End Property
End Class
Následující kód opravuje předchozí porušení přepnutím argumentů konstruktoru.
public class Book
{
public Book(string title)
{
Title = title ??
throw new ArgumentNullException(nameof(title), "All books must have a title.");
}
public string Title { get; }
}
Public Class Book
Private ReadOnly _Title As String
Public Sub New(ByVal title As String)
If (title Is Nothing) Then
Throw New ArgumentNullException("title", "title cannot be a null reference (Nothing in Visual Basic)")
End If
_Title = title
End Sub
Public ReadOnly Property Title()
Get
Return _Title
End Get
End Property
End Class