共用方式為


CA2208:請正確執行個體化引數例外狀況

型別名稱

InstantiateArgumentExceptionsCorrectly

CheckId

CA2208

分類

Microsoft.Usage

中斷變更

不中斷

原因

可能原因包括下列狀況:

  • 對例外狀況型別為 (或衍生自) [System.ArgumentException] 的預設 (無參數) 建構函式進行呼叫。

  • 將錯誤的字串引數傳遞至例外狀況型別為 (或衍生自) [System.ArgumentException.] 的參數化建構函式。

規則描述

請呼叫其中一個可以提供更有意義之例外狀況 (Exception) 訊息的建構函式多載,而不呼叫預設建構函式。 例外狀況訊息應以程式開發人員為目標對象,清楚說明錯誤情況以及如何修正和避免例外狀況。

ArgumentException 與衍生型別 (Derived Type) 之建構函式 (由一個和兩個字串組成) 的簽章在 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;            
            }        
        }    
    };
}