Udostępnij za pośrednictwem


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