CA2208:Istanziare correttamente le eccezioni di argomenti

CA2208:Istanziare correttamente le eccezioni di argomenti

La regola di analisi del codice CA2208 verifica la presenza di errori comuni durante la creazione di eccezioni di argomenti. Esistono tre classi di eccezioni di argomenti principali:ArgumentException, ArgumentNullException e ArgumentOutOfRangeException. Sfortunatamente, è facile commettere un errore quando li usi. Spiegherò gli errori comuni che CA2208 verifica e come risolverli (e quando invece eliminare l'avviso).

Caso 1 – paramName / messaggio sono passati nell'ordine sbagliato

Quando passi i parametri dell'eccezione dell'argomento nell'ordine sbagliato, riceverai un avviso CA2208 come:

Ecco un esempio di questo problema. L'ordine dei parametri è (paramName, message) e vengono accidentalmente passati come (message, paramName):

//Method signature
public ArgumentOutOfRangeException(string? paramName, string? message);

//Example of passing the parameters in the wrong order:
throw new ArgumentOutOfRangeException("Valid range: 100-999", nameof(id));
Code language: C# (cs)

Nota:per rendere le cose più confuse, ArgumentException ha l'ordine dei parametri opposto (messaggio, nomeparametro).

La semplice risposta qui è mettere gli argomenti nel giusto ordine. Tuttavia, suggerirei invece di utilizzare argomenti con nome.

Quando hai due parametri dello stesso tipo (stringa in questo caso) uno accanto all'altro, è molto facile trasporli accidentalmente come mostrato sopra. Il modo migliore per proteggersi da questo tipo di problemi in generale è prendere l'abitudine di usare argomenti con nome (che rendono irrilevante l'ordine dei parametri). Ecco un esempio di creazione di un'eccezione argomento con argomenti denominati:

throw new ArgumentOutOfRangeException(message: "Valid range: 100-999", paramName: nameof(id));
Code language: C# (cs)

Trasmissione del solo nome del parametro ad ArgumentException

ArgumentException non ha un overload che accetta solo paramName , ma ne ha uno che accetta solo messaggio . Quando il compilatore può dire che stai passando un nome di parametro per messaggio , riporterà lo stesso avviso CA2208 mostrato nella sezione precedente. Ecco un esempio di cosa potrebbe causare questo:

throw new ArgumentException(nameof(id));
Code language: C# (cs)

E 'veramente un problema? Tocca a voi. Forse vuoi davvero passare solo il nome del parametro in questo modo e vuoi eliminare l'avviso CA2208. In tal caso, puoi eliminare CA2208 per questa riga di codice:

#pragma warning disable CA2208 // Instantiate argument exceptions correctly
 throw new ArgumentException(nameof(id));
#pragma warning restore CA2208 // Instantiate argument exceptions correctly
Code language: C# (cs)

Caso 2:paramName non corrisponde ai parametri del metodo

Quando passi paramName a un'eccezione di argomento, il compilatore controlla se corrisponde al nome di uno dei parametri del metodo. In caso contrario, abbina, riceverai un avviso CA2208 come questo:

Innanzitutto, se vuoi paramName per abbinare esattamente il nome del parametro del metodo, suggerisco di utilizzare l'operatore nameof() invece di codificare il nome:

public Person Get(string uniqueId)
{
	throw new ArgumentNullException(paramName: nameof(uniqueId));
}
Code language: C# (cs)

In secondo luogo, supponiamo che tu stia utilizzando intenzionalmente il nome della proprietà di un parametro anziché il nome del parametro. Ecco un esempio:

public void Post(Person person)
{
	throw new ArgumentNullException(paramName: nameof(person.FirstName));
}
Code language: C# (cs)

Va benissimo lanciare un'eccezione argomento per la proprietà di un parametro come questa e chiaramente paramName non corrisponderà al nome del parametro. In questo caso, se vuoi davvero eliminare l'avviso CA2208, puoi sopprimerlo per questa riga:

#pragma warning disable CA2208 // Instantiate argument exceptions correctly
throw new ArgumentNullException(paramName: nameof(person.FirstName));
#pragma warning restore CA2208 // Instantiate argument exceptions correctly
Code language: C# (cs)

Caso 3:utilizzo di un costruttore senza parametri

Quando utilizzi il costruttore senza parametri di un'eccezione di argomento (ovvero new ArgumentException()), riceverai un avviso CA2208 come questo:

Sebbene l'utilizzo del costruttore senza parametri non sia tecnicamente sbagliato (dopotutto esiste), nella maggior parte dei casi ha probabilmente senso passare message / paramName per fornire informazioni specifiche sull'eccezione.

Tuttavia, se si decide che ha più senso utilizzare il costruttore senza parametri e si desidera eliminare l'avviso CA2208, è possibile eliminare CA2208 per questa riga:

#pragma warning disable CA2208 // Instantiate argument exceptions correctly
throw new ArgumentNullException();
#pragma warning restore CA2208 // Instantiate argument exceptions correctly
Code language: C# (cs)