CA2208: правильно создавайте экземпляры аргументов исключений
TypeName |
InstantiateArgumentExceptionsCorrectly |
CheckId |
CA2208 |
Категория |
Microsoft.Usage |
Критическое изменение |
Не критическое |
Причина
Возможные причины:
Выполнен вызов конструктора по умолчанию (не принимающего параметров), который принадлежит к типу [System.ArgumentException] или наследует от этого типа.
Неверный строковый аргумент передан параметризованному конструктору, который принадлежит к типу [System.ArgumentException.] или наследуется от этого типа.
Описание правила
Вместо конструктора по умолчанию вызовите одну из перегрузок этого конструктора, которая позволяет предоставлять более содержательные сообщения об исключениях.Сообщение об исключении должно предназначаться разработчикам и предоставлять четкие сведения о состоянии ошибки и способах устранения этой ошибки или предотвращения ее появления.
Подписи одного или двух строковых конструкторов типа ArgumentException или одного из его производных типов не соответствуют объявлению с точки зрения использования параметров message и paramName.Убедитесь, что эти конструкторы вызываются с правильными строковыми аргументами.Подписи должны выглядеть следующим образом:
ArgumentException(строка message)
ArgumentException(строка message, строка paramName)
ArgumentNullException(строка paramName)
ArgumentNullException(строка paramName, строка message)
ArgumentOutOfRangeException(строка paramName)
ArgumentOutOfRangeException(строка paramName, строка message)
DuplicateWaitObjectException(строка parameterName)
DuplicateWaitObjectException(строка parameterName, строка message)
Устранение нарушений
Для устранения нарушения данного правила вызовите конструктор, который принимает сообщение, имя параметра или оба этих аргумента, и убедитесь, что аргументы соответствуют типу ArgumentException вызываемого конструктора.
Отключение предупреждений
Отключение предупреждений о нарушении данного правила безопасно только в том случае, если параметризованный конструктор вызывается с правильными аргументами.
Пример
В следующем примере показан конструктор, который неверно создает экземпляр типа 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;
}
}
};
}
В следующем примере описанное нарушение устраняется посредством изменения порядка аргументов конструктора.
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;
}
}
};
}