Criar uma instância do argumento exceções corretamente

TypeName

InstantiateArgumentExceptionsCorrectly

CheckId

CA2208

Category (Categoria)

Microsoft.uso

Quebrando alterar

Não separável

Causa

É feita uma telefonar ao construtor (sem parâmetros) padrão de um tipo de exceção que é ou é derivada de ArgumentException.

- ou -

Um argumento de seqüência de caracteres incorreto é passado para um construtor com parâmetros de um tipo de exceção que é ou deriva de ArgumentException.

Descrição da regra

Em vez de chamar o construtor padrão, chame uma das sobrecargas construtor que permite que uma mensagem de exceção mais significativa a ser fornecido.A mensagem de exceção deve direcionar o desenvolvedor e explique claramente a condição de erro e como corrigir ou evitar a exceção.

As assinaturas dos construtores de cadeia de caracteres de um e dois de ArgumentException e seus tipos derivados não são consistentes com relação à message e paramName parâmetros. Certifique-se de que esses construtores são chamados com os argumentos de seqüência de caracteres correta.sistema autônomo assinaturas são:

ArgumentException(seqüência de caracteres message)

ArgumentException(seqüência de caracteres message, seqüência de caracteres paramName)

ArgumentNullException(seqüência de caracteres paramName)

ArgumentNullException(seqüência de caracteres paramName, seqüência de caracteres message)

ArgumentOutOfRangeException(seqüência de caracteres paramName)

ArgumentOutOfRangeException(seqüência de caracteres paramName, seqüência de caracteres message)

DuplicateWaitObjectException(seqüência de caracteres parameterName)

DuplicateWaitObjectException(seqüência de caracteres parameterName, seqüência de caracteres message)

Como corrigir violações

Para corrigir uma violação dessa regra, chamar um construtor que leva a uma mensagem, um nome de parâmetro ou ambos e verifique se que os argumentos são adequados para o tipo de ArgumentException sendo chamado.

Quando suprimir avisos

É seguro eliminar um aviso esta regra somente se um construtor parametrizado é chamado com os argumentos de seqüência de caracteres correta.

Exemplo

O exemplo a seguir mostra um construtor instancia uma instância do tipo ArgumentNullException incorretamente.

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

O exemplo a seguir corrige a violação anterior, alternando os argumentos do construtor.

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