2010-03-10 7 views
4

Je l'ai vu le cas d'exception suivante à plusieurs reprisesQuelle classe exception à utiliser lorsque IEnumerable contient null

public SomeClass(IEnumerable<T> someValues) 
    { 
     if (null == someValues) 
     { 
      throw new ArgumentNullException("someValues"); 
     } 

     int counter = 0; 
     foreach (T value in someValues) 
     { 
      if (null == value) 
      { 
       string msg = counter + "th value was null"; 
       // What exception class to use? 
       throw new ArgumentException(msg, "someValues"); 
      } 
      counter++; 
     } 
    } 

est-il une ligne directrice pour traiter ces cas? Et en général, est-il des lignes directrices décrivant le "style d'exception" un peu plus détaillée que la documentation MSDN pour

Répondre

4

Oui, il est, comme décrit here, vous devriez jeter des exceptions de cadre lorsque cela est possible et jeter l'exception la plus dérivée qui est applicable. Dans ce cas ArgumentNullException est lancé car un argument est nul et ArgumentException est lancé car le contenu de l'énumération n'est pas directement un paramètre de la fonction, ce que vous pouvez dire, c'est que l'argument est invalide, mais ce n'est pas parce qu'il est nul ou est hors de portée.

Si le fait de savoir pourquoi il est invalide devient absolument nécessaire, vous pouvez dériver de Argument Exception; quelque chose comme ArgumentCollectionContainsNullException.

+0

Merci pour les liens: http://msdn.microsoft.com/en-us/library/ms229007.aspx contenait exactement ce que je cherchais. –

8

Throw ArgumentNullException s'il y avait un argument nul.

Throw ArgumentOutOfRange exception s'il y avait un argument de sa gamme (comme un nombre négatif où seuls nombres positifs étaient attendus.)

Throw ArgumentException si l'argument était invalide pour une raison autre que c'était hors de portée ou null.

Jeter InvalidOperationException si l'appel était invalide pour une raison ne se rapportant pas spécifiquement à une valeur d'un argument.

Dans ce cas particulier, je choisirais probablement ArgumentException. L'argument est invalide car son contenu est invalide.

Bien sûr, tous ces éléments sont des exceptions qui indiquent que l'appelant a un bug. C'est une bonne habitude de donner la meilleure erreur possible afin que l'auteur de l'appelant buggy puisse rapidement diagnostiquer le problème. Je considérerais donc également ajouter un message personnalisé à l'exception en disant "l'élément de la séquence blah était de manière inattendue nulle" ou une telle chose.

+0

Merci. Est-ce documenté quelque part? Ou devrais-je juste prendre votre mot là-dessus puisque vous écrivez le compilateur :) –

+1

Une recherche de InvalidArgumentException a retourné des classes dans Microsoft.SharePoint.Portal.Alerts et Microsoft.SqlServer.Management.Common. Je ne suis pas sûr que ce soit le cas ici. –

+0

Oups, vous avez raison. Je me trompais. Merci! –

Questions connexes