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