CA2208: Criar uma instância de exceções do argumento corretamente
TypeName |
InstantiateArgumentExceptionsCorrectly |
CheckId |
CA2208 |
<strong>Categoria</strong> |
Microsoft.Usage |
Alteração significativa |
Não separável |
Causa
Possíveis causas incluem as seguintes situações:
É feita uma chamada ao construtor padrão (sem parâmetros) de um tipo de exceção que é ou deriva de [System.ArgumentException].
Um argumento de seqüência de caracteres incorreto é passado para um construtor parametrizado de um tipo de exceção que é ou deriva de[System.ArgumentException.]
Descrição da regra
Em vez de chamar o construtor padrão, chame uma das sobrecargas de construtor que permite que uma mensagem de exceção mais significativa a ser fornecido. A mensagem de exceção deve direcionar o desenvolvedor e explicar 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 ao message e paramName parâmetros. Certificar-se de que esses construtores chamam-se com os argumentos de seqüência de caracteres correta. As assinaturas são:
ArgumentException(seqüência de caracteres message)
ArgumentException(seqüência de caracteres message, string paramName)
ArgumentNullException(seqüência de caracteres paramName)
ArgumentNullException(seqüência de caracteres paramName, string message)
ArgumentOutOfRangeException(seqüência de caracteres paramName)
ArgumentOutOfRangeException(seqüência de caracteres paramName, string message)
DuplicateWaitObjectException(seqüência de caracteres parameterName)
DuplicateWaitObjectException(seqüência de caracteres parameterName, string message)
Como corrigir violações
Para corrigir uma violação desta regra, chamar um construtor que leva a uma mensagem, um nome de parâmetro ou ambos e certificar-se de que os argumentos são adequados para o tipo de ArgumentException que está 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 que incorretamente instancia uma instância do 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;
}
}
};
}
O exemplo a seguir corrige a violação acima, 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;
}
}
};
}