CA2208: Argument-uitzonderingen op de juiste manier instantiëren
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2208 |
Titel | Argument-uitzonderingen op de juiste manier instantiëren |
Categorie | Gebruik |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
Wanneer een methode een parameter heeft en er een uitzonderingstype wordt gegenereerd dat is, of is afgeleid van, wordt verwacht dat een constructor die een paramName
parameter juist accepteert, ArgumentExceptionaanroept. Mogelijke oorzaken zijn de volgende situaties:
- Er wordt een aanroep uitgevoerd naar de standaardconstructor (parameterloos) van een uitzonderingstype dat is of is afgeleid van, ArgumentException die ook een constructor heeft die een
paramName
parameter accepteert. - Er wordt een onjuist tekenreeksargument doorgegeven aan een geparameteriseerde constructor van een uitzonderingstype dat wel of niet is afgeleid van. ArgumentException
- Een van de namen van de parameters wordt doorgegeven voor het
message
argument van de constructor van het uitzonderingstype dat wil of is afgeleid van. ArgumentException
Beschrijving van regel
In plaats van de standaardconstructor aan te roepen, roept u een van de constructoroverbelastingen aan waarmee een duidelijker uitzonderingsbericht kan worden opgegeven. Het uitzonderingsbericht moet gericht zijn op de ontwikkelaar en duidelijk de foutvoorwaarde uitleggen en hoe de uitzondering moet worden gecorrigeerd of vermeden.
De handtekeningen van de ene en twee tekenreeksconstructors van ArgumentException en de afgeleide typen zijn niet consistent met betrekking tot de positie message
en paramName
parameters. Zorg ervoor dat deze constructors worden aangeroepen met de juiste tekenreeksargumenten. De handtekeningen zijn als volgt:
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)
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, roept u een constructor aan die een bericht, een parameternaam of beide gebruikt en controleert u of de argumenten juist zijn voor het type ArgumentException aangeroepen.
Tip
Er is een codeoplossing beschikbaar in Visual Studio voor onjuist geplaatste parameternamen. Als u deze wilt gebruiken, plaatst u de cursor op de waarschuwingsrij en drukt u op Ctrl+. (punt). Kies De volgorde van argumenten wisselen in de lijst met opties die worden weergegeven.
Als een parameternaam in plaats van een bericht wordt doorgegeven aan de ArgumentException(String) methode, biedt de fixer de optie om over te schakelen naar de constructor met twee argumenten.
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel alleen te onderdrukken als een geparameteriseerde constructor wordt aangeroepen met de juiste tekenreeksargumenten.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA2208
// The code that's violating the rule is on this line.
#pragma warning restore CA2208
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA2208.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Code configureren om te analyseren
Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.
U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (ontwerp) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Specifieke API-oppervlakken opnemen
U kunt instellen op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:
dotnet_code_quality.CAXXXX.api_surface = private, internal
De CA2208-regel is standaard van toepassing op alle API-oppervlakken (openbaar, intern en privé).
Opmerking
De volgende code toont een constructor die een instantie van 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
Met de volgende code wordt de vorige schending opgelost door de constructorargumenten over te schakelen.
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