Partilhar via


CA2208: instanciar exceções de argumento corretamente

TypeName

InstantiateArgumentExceptionsCorrectly

CheckId

CA2208

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

As causas possíveis incluem as seguintes situações:

  • For feita uma chamada para o construtor (sem parâmetros) padrão de um tipo de exceção ou seja, ou é derivado de [System.ArgumentException].

  • Um argumento incorreto de cadeia de caracteres é passado a um construtor com parâmetros de um tipo de exceção ou seja, ou é derivado de [System.ArgumentException.]

Descrição da Regra

Em vez de chamar o construtor padrão, chame uma das sobrecargas do construtor que permite que uma mensagem de exceção mais significativo é fornecida.A mensagem de exceção deve ter como destino o desenvolvedor e claramente explicar a condição de erro e como corrigir ou impedir a exceção.

As assinaturas de um e dois construtores de cadeia de caracteres de ArgumentException e seus tipos derivados não são consistentes em relação aos parâmetros de message e de paramName .Verifique se estes construtores são chamados com os argumentos corretos de cadeia de caracteres.As assinaturas são os seguintes:

ArgumentException(cadeia de caracteres message)

ArgumentException(cadeia de caracteres message, cadeia de caracteres paramName)

ArgumentNullException(cadeia de caracteres paramName)

ArgumentNullException(cadeia de caracteres paramName, cadeia de caracteres message)

ArgumentOutOfRangeException(cadeia de caracteres paramName)

ArgumentOutOfRangeException(cadeia de caracteres paramName, cadeia de caracteres message)

DuplicateWaitObjectException(cadeia de caracteres parameterName)

DuplicateWaitObjectException(cadeia de caracteres parameterName, cadeia de caracteres message)

Como Corrigir Violações

Para corrigir uma violação desta regra, chamar um construtor que usa uma mensagem, um nome de parâmetro, ou ambos, e verifique se os argumentos são apropriadas para o tipo de ArgumentException que está sendo chamado.

Quando Suprimir Alertas

É seguro suprimir um aviso desta regra apenas se um construtor com parâmetros é chamado com os argumentos corretos de cadeia de caracteres.

Exemplo

O exemplo a seguir mostra um construtor que cria uma instância incorretamente uma instância do tipo de 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;            
            }        
        }    
    };
}

O exemplo a seguir corrige a violação acima alternando os argumentos de 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;            
            }        
        }    
    };
}