다음을 통해 공유


CA2208: 인수 예외를 올바르게 인스턴스화하십시오.

속성
규칙 ID CA2208
제목 인수 예외를 올바르게 인스턴스화하세요.
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 제안 사항

원인

메서드에 매개 변수가 있는 경우, ArgumentException이거나 이로부터 파생된 예외 형식을 throw하는 경우에 paramName 매개 변수를 올바르게 허용하는 생성자를 호출해야 합니다. 가능한 원인은 다음과 같습니다.

  • 매개 변수를 허용하는 생성자도 있는 예외 형식 또는 파생 ArgumentException 된 예외 형식의 기본(매개 변수 없는) 생성자를 호출합니다 paramName .
  • 잘못된 문자열 인수가 ArgumentException이거나 또는 이로부터 파생된 예외 형식의 매개 변수화된 생성자에 전달되었습니다.
  • 매개 변수 이름 중 하나가, ArgumentException이거나 또는 이로부터 파생된 예외 형식 생성자의 message 인수에 대해 전달되었습니다.

규칙 설명

기본 생성자를 호출하는 대신, 더욱 의미 있는 예외 메시지를 제공할 수 있도록 하는 생성자 오버로드 중 하나를 호출합니다. 예외 메시지는 개발자를 대상으로 하며 오류 조건 및 예외를 해결하거나 방지하는 방법을 명확하게 설명해야 합니다.

ArgumentException 및 해당 파생 형식의 한 문자열 생성자 및 두 문자열 생성자에 대한 시그니처는 위치 messageparamName 매개 변수와 일치하지 않습니다. 올바른 문자열 인수를 사용하여 이러한 생성자가 호출되었는지 확인합니다. 시그니처는 다음과 같습니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 메시지, 매개 변수 이름 또는 두 가지를 모두 사용하는 생성자를 호출하고 인수가 호출되는 ArgumentException의 형식에 적합한지 확인합니다.

Visual Studio에서 잘못 배치된 매개 변수 이름에 대한 코드를 수정할 수 있습니다. 이를 사용하려면 커서를 경고 행에 놓고 Ctrl+ 키를 누릅니다( 마침표). 표시되는 옵션 목록에서 인수 순서 바꾸기를 선택합니다.

CA2208에 대한 코드 수정 사항 - 인수 바꾸기

메시지 대신 매개 변수 이름을 메서드에 전달하는 경우 ArgumentException(String) 수정 도구는 대신 두 인수 생성자로 전환하는 옵션을 제공합니다.

CA2208에 대한 코드 수정 사항 - 두 인수 생성자로 전환

경고를 표시하지 않는 경우

올바른 문자열 인수를 사용하여 매개 변수화된 생성자를 호출하는 경우에만 이 규칙의 경고를 표시하지 않아도 됩니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA2208
// The code that's violating the rule is on this line.
#pragma warning restore CA2208

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA2208.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

분석할 코드 구성

다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.

이 규칙, 적용되는 모든 규칙 또는 적용되는 이 범주(디자인)의 모든 규칙에 대해 이 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.

특정 API 화면 포함

접근성을 기반으로 이 규칙을 실행할 코드베이스의 파트를 구성할 수 있습니다. 예를 들어 규칙이 퍼블릭이 아닌 API 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.api_surface = private, internal

기본적으로 CA2208 규칙은 모든 API 표면(public, internal, private)에 적용됩니다.

예시

다음 코드에서는 ArgumentNullException의 인스턴스를 잘못 인스턴스화하는 생성자를 보여 줍니다.

public class Book
{
    public Book(string title)
    {
        Title = title ??
            throw new ArgumentNullException("All books must have a title.", nameof(title));
    }

    public string Title { get; }
}
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

다음 코드는 생성자 인수를 전환하여 이전 위반을 수정합니다.

public class Book
{
    public Book(string title)
    {
        Title = title ??
            throw new ArgumentNullException(nameof(title), "All books must have a title.");
    }

    public string Title { get; }
}
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