CA2208 : Instanciez les exceptions d'argument comme il se doit
TypeName |
InstantiateArgumentExceptionsCorrectly |
CheckId |
CA2208 |
Catégorie |
Microsoft.Usage |
Modification avec rupture |
Modification sans rupture |
Cause
Plusieurs causes sont possibles :
Le constructeur par défaut (sans paramètre) d'un type d'exception qui correspond à ou dérive de [System.ArgumentException] est appelé.
Un argument de chaîne incorrect est passé à un constructeur paramétré d'un type d'exception qui correspond à ou dérive de [System.ArgumentException.]
Description de la règle
Au lieu d'appeler le constructeur par défaut, appelez l'une des surcharges de constructeur qui permettent de fournir un message d'exception plus explicite.Le message d'exception doit s'adresser au développeur et clairement expliquer la condition d'erreur ainsi que la manière de corriger ou éviter l'exception.
Les signatures des premier et second constructeurs string de ArgumentException et ses types dérivés ne sont pas cohérents en ce qui concerne les paramètres message et paramName.Assurez-vous que ces constructeurs sont appelés avec les arguments string corrects.Les signatures sont les suivantes :
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)
Comment corriger les violations
Pour corriger une violation de cette règle, appelez un constructeur qui accepte un message, un nom de paramètre, ou les deux, et assurez-vous que les arguments sont adaptés au type de ArgumentException appelé.
Quand supprimer les avertissements
Il est possible de supprimer sans risque un avertissement de cette règle uniquement si un constructeur paramétré est appelé avec les arguments string corrects.
Exemple
L'exemple suivant présente un constructeur qui n'instancie pas correctement une instance du type ArgumentNullException.
Imports System
Namespace Samples1
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
End Namespace
using System;
namespace Samples1
{
public class Book
{
private readonly string _Title;
public Book(string title)
{
// Violates this rule (constructor arguments are switched)
if (title == null)
throw new ArgumentNullException("title cannot be a null reference (Nothing in Visual Basic)", "title");
_Title = title;
}
public string Title
{
get { return _Title; }
}
}
}
using namespace System;
namespace Samples1
{
public ref class Book
{
private: initonly String^ _Title;
public:
Book(String^ title)
{
// Violates this rule (constructor arguments are switched)
if (title == nullptr)
throw gcnew ArgumentNullException("title cannot be a null reference (Nothing in Visual Basic)", "title");
_Title = title;
}
property String^ Title
{
String^ get()
{
return _Title;
}
}
};
}
L'exemple suivant résout la violation ci-dessus en changeant les arguments du constructeur.
Namespace Samples2
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
End Namespace
namespace Samples2
{
public class Book
{
private readonly string _Title;
public Book(string title)
{
if (title == null)
throw new ArgumentNullException("title", "title cannot be a null reference (Nothing in Visual Basic)");
_Title = title; }
public string Title
{
get { return _Title; }
}
}
}
using namespace System;
namespace Samples2
{
public ref class Book
{
private: initonly String^ _Title;
public:
Book(String^ title)
{
if (title == nullptr)
throw gcnew ArgumentNullException(("title", "title cannot be a null reference (Nothing in Visual Basic)"));
_Title = title;
}
property String^ Title
{
String^ get()
{
return _Title;
}
}
};
}