Compartir a través de


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;            
            }        
        }    
    };
}