CA2208: Utwórz poprawne wystąpienia wyjątków argumentów
TypeName |
InstantiateArgumentExceptionsCorrectly |
CheckId |
CA2208 |
Kategoria |
Microsoft.Usage |
Złamanie zmiany |
Bez podziału |
Przyczyna
Możliwe przyczyny: w następujących sytuacjach:
Wywołanie do domyślnego (bezparametrowego) konstruktora z typ wyjątku, który jest lub pochodzi od [System.ArgumentException].
Ciąg niepoprawny argument jest przekazywany do sparametryzowana Konstruktor typ wyjątku, który jest lub pochodzi od[System.ArgumentException.]
Opis reguły
Zamiast wywołaniem konstruktora domyślnego, wywołania jednej z przeciążeniem konstruktora, które pozwala na bardziej opisową komunikat wyjątku mają być dostarczone.Komunikat wyjątku powinien docelowe autora i wyraźnie wyjaśnić warunek błędu i jak rozwiązać lub uniknąć wyjątek.
Podpisy konstruktory ciąg jednego i dwóch z ArgumentException i jego pochodnych typów nie są zgodne z message i paramName parametry.Upewnij się, że te konstruktory są nazywane argumentów właściwego typu string.Podpisy są w następujący sposób:
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)
Jak naprawić naruszenia
Ustalenie naruszenie tej zasady, wywołanie konstruktora, który przyjmuje do wiadomości lub nazwę parametru i upewnić się, że argumenty są właściwe dla danego typu ArgumentException wywoływana.
Kiedy do pomijania ostrzeżenia
Bezpiecznie pominąć ostrzeżenie od tej zasady tylko wtedy, gdy sparametryzowana konstruktora jest wywoływana z argumentów właściwego typu string.
Przykład
Poniższy przykład pokazuje Konstruktor, który niepoprawnie tworzy wystąpienie typu 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;
}
}
};
}
Poniższy przykład rozwiązuje powyżej naruszenie przez przełączanie argumentów konstruktora.
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;
}
}
};
}