Argumentausnahmen korrekt instanziieren

Aktualisiert: November 2007

     TypeName

InstantiateArgumentExceptionsCorrectly

CheckId

CA2208

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Es wird der (parameterlose) Standardkonstruktor eines Ausnahmetyps aufgerufen, der ArgumentException entspricht oder davon abgeleitet wird.

- oder -

Es wird ein falsches Zeichenfolgenargument an den parametrisierten Konstruktor eines Ausnahmetyps übergeben, der ArgumentException entspricht oder davon abgeleitet wird.

Regelbeschreibung

Statt den Standardkonstruktor aufzurufen, sollte einer der überladenen Konstruktoren aufgerufen werden, der zulässt, dass eine aussagekräftigere Ausnahmemeldung bereitgestellt wird. Die Ausnahmemeldung sollte auf den Entwickler abzielen und die Fehlerbedingung und Wege zur Behebung oder Vermeidung der Ausnahme klar darlegen.

Die Signaturen der Konstruktoren von ArgumentException und davon abgeleiteten Typen mit einer oder zwei Zeichenfolgen sind nicht konsistent in Bezug auf den message-Parameter und den paramName-Parameter. Stellen Sie sicher, dass diese Konstruktoren mit den richtigen Zeichenfolgenargumenten aufgerufen werden. Die Signaturen lauten wie folgt:

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)

Behandlung von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, rufen Sie einen Konstruktor auf, der eine Meldung, einen Parameternamen oder beides annimmt, und stellen sicher, dass die Argumente für den Typ von ArgumentException, der aufgerufen wird, korrekt sind.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann nur dann gefahrlos unterdrückt werden, wenn ein parametrisierter Konstruktor mit den richtigen Zeichenfolgenargumenten aufgerufen wird.

Beispiel

Im folgenden Beispiel wird ein Konstruktor veranschaulicht, der unordnungsgemäß eine Instanz des ArgumentNullException-Typs instanziiert.

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

Im folgenden Beispiel wird der oben erwähnte Verstoß korrigiert, indem die Konstruktorargumente vertauscht werden.

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