Поделиться через


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