CA2208: Crear instancias de las excepciones del argumento correctamente
Nombre de tipo |
InstantiateArgumentExceptionsCorrectly |
Identificador de comprobación |
CA2208 |
Categoría |
Microsoft.Usage |
Cambio problemático |
No |
Causa
Entre las posibles causas se incluyen las siguientes situaciones:
Se realiza una llamada al constructor predeterminado (sin parámetros) de un tipo de excepción que es o se deriva de [System.ArgumentException].
Se pasa un argumento de cadena incorrecto a un constructor con parámetros de un tipo de excepción que es o se deriva de [System.ArgumentException.]
Descripción de la regla
En lugar de llamar al constructor predeterminado, llame a una de las sobrecargas del constructor que permite proporcionar un mensaje de excepción más significativo. El mensaje de excepción debería dirigirse al desarrollador y explicar claramente la condición de error y cómo corregir o evitar la excepción.
Las firmas de uno o dos constructores de cadena de ArgumentException y sus tipos derivados no son coherentes con respecto a los parámetros message y paramName. Asegúrese de que se llama a estos constructores con los argumentos de cadena correctos. Éstas son las firmas:
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)
Cómo corregir infracciones
Para corregir una infracción de esta regla, llame al constructor que toma un mensaje, un nombre de parámetro, o ambos, y asegúrese de que los argumentos son los adecuados para el tipo de ArgumentException a la que se llama.
Cuándo suprimir advertencias
Es seguro suprimir una advertencia de esta regla sólo si se llama a un constructor parametrizado con los argumentos de cadena correctos.
Ejemplo
En el ejemplo siguiente se muestra un constructor que por error crea instancias de una instancia del tipo 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;
}
}
};
}
En el ejemplo siguiente se corrige la infracción anterior intercambiando los argumentos del constructor.
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;
}
}
};
}