CA2208: Creare istanze di eccezioni di argomento correttamente

Proprietà valore
ID regola CA2208
Title Creare istanze di eccezioni di argomento correttamente
Categoria Utilizzo
La correzione causa un'interruzione o meno Non causa un'interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Quando un metodo ha un parametro e genera un tipo di eccezione o deriva da , ArgumentExceptionè previsto chiamare un costruttore che accetta correttamente un paramName parametro. Le possibili cause includono le situazioni seguenti:

  • Viene effettuata una chiamata al costruttore predefinito (senza parametri) di un tipo di eccezione, ovvero deriva da , ArgumentException che ha anche un costruttore che accetta un paramName parametro.
  • Un argomento stringa non corretto viene passato a un costruttore con parametri di un tipo di eccezione o deriva da . ArgumentException
  • Uno dei nomi dei parametri viene passato per l'argomento message del costruttore del tipo di eccezione, ovvero deriva da , ArgumentException.

Descrizione regola

Anziché chiamare il costruttore predefinito, chiamare uno degli overload del costruttore che consente di fornire un messaggio di eccezione più significativo. Il messaggio di eccezione deve essere destinati allo sviluppatore e spiegare chiaramente la condizione di errore e come correggere o evitare l'eccezione.

Le firme di uno e due costruttori stringa di ArgumentException e i relativi tipi derivati non sono coerenti rispetto alla posizione message e paramName ai parametri. Assicurarsi che questi costruttori vengano chiamati con gli argomenti stringa corretti. Le firme sono le seguenti:

Come correggere le violazioni

Per correggere una violazione di questa regola, chiamare un costruttore che accetta un messaggio, un nome di parametro o entrambi e assicurarsi che gli argomenti siano appropriati per il tipo di ArgumentException chiamata.

Suggerimento

Una correzione del codice è disponibile in Visual Studio per i nomi dei parametri posizionati in modo non corretto. Per usarlo, posizionare il cursore sulla riga di avviso e premere CTRL+. (punto). Scegliere Scambia l'ordine degli argomenti dall'elenco di opzioni presentate.

Correzione del codice per ca2208 - argomenti di scambio.

Se al metodo viene passato ArgumentException(String) un nome di parametro anziché un messaggio, il fixer fornisce invece l'opzione per passare al costruttore a due argomenti.

Correzione del codice per CA2208: passare al costruttore a due argomenti.

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola solo se viene chiamato un costruttore con parametri con gli argomenti stringa corretti.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Configurare il codice da analizzare

Usare l'opzione seguente per configurare le parti della codebase in cui eseguire questa regola.

È possibile configurare questa opzione solo per questa regola, per tutte le regole a cui si applica o per tutte le regole in questa categoria (Progettazione) a cui si applica. Per altre informazioni, vedere Opzioni di configurazione delle regole di qualità del codice.

Includere superfici API specifiche

È possibile configurare le parti della codebase in modo da eseguire questa regola in base all'accessibilità. Ad esempio, per specificare che la regola deve essere eseguita solo sulla superficie dell'API non pubblica, aggiungere la coppia chiave-valore seguente a un file con estensione editorconfig nel progetto:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Per impostazione predefinita, la regola CA2208 si applica a tutte le superfici API (pubbliche, interne e private).

Esempio

Nel codice seguente viene illustrato un costruttore che crea erroneamente un'istanza di 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

Il codice seguente corregge la violazione precedente cambiando gli argomenti del costruttore.

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