/ / ArgumentNullException ou NullReferenceException de la méthode d'extension? - .net, exception, méthodes d'extension

ArgumentNullException ou NullReferenceException de la méthode d'extension? - .net, exception, méthodes d'extension

Que considéreriez-vous comme la meilleure exception?type à lancer quand une méthode d'extension est appelée sur une instance nulle (où la méthode d'extension ne le permet pas)? Puisque les méthodes d’extension ne sont que des méthodes statiques, vous pourriez soutenir qu’il devrait s’agir de ArgumentNullException, mais elles sont utilisées comme des méthodes d’instance. Il serait donc plus naturel d’utiliser NullReferenceException. Prenons l’exemple suivant:

public static string ToInvariantString(this IFormattable value, string format)
{
return value.ToString(format, CultureInfo.InvariantCulture);
}

De cette manière, une exception NullReferenceException sera levée si le paramètre value est null.

L'autre exemple serait:

public static string ToInvariantString(this IFormattable value, string format)
{
if (value == null) throw new ArgumentNullException("value");
return value.ToString(format, CultureInfo.InvariantCulture);
}

MODIFIER: Dans certaines réponses, vous avez indiqué queune méthode d'extension peut s'appeler une méthode statique et dans ce cas, une exception de référence nulle serait une erreur, ce qui est un très bon point et une de mes préoccupations, je ne sais pas pourquoi j'ai oublié de mentionner cela dans la question .

Quelqu'un a également fait remarquer que c’est une erreur de lancer une exception NullReferenceException, et c’est bien le cas. C’est pourquoi je ne le jette pas, je le laisse juste arriver (laissez le CLR le faire) en ne gardant pas la méthode.

Je pense que je favorise l’exception ArgumentNullException (that "sce que j’ai utilisé jusqu’à présent), mais je pense toujours qu’il ya au moins une marge de manœuvre pour plaider en faveur d’une exception NullReferenceException car elle semble plus naturelle dans la plupart des endroits où la méthode sera utilisée.

Réponses:

34 pour la réponse № 1

En général, exception incluse, vous devez traiter une méthode d'extension comme s'il s'agissait d'une méthode statique normale. Dans ce cas, vous devriez lancer une exception ArgumentNullException.

Lancer une exception NullReferenceException ici est une mauvaise idée pour plusieurs raisons

  • Une référence nulle ne s'est pas réellement produite, ce qui est contre-intuitif.
  • Lancer une exception NullReferenceException et provoquer uneNullReferenceException à se produire produit des exceptions discernablement différentes (une façon de voir la différence est le code d'erreur). Cela est vrai de nombreuses exceptions levées par le CLR.

Voir Quand pouvez-vous attraper une exception StackOverflowException (un post que j'ai fait à ce sujet).

  • Il est préférable d'appeler une méthode d'extension comme s'il s'agissait d'une méthode standard. Dans ce cas, je ne ferais certainement pas exception d'une exception NullReferenceException, mais d'une exception ArgumentNullException.

21 pour la réponse № 2

Mis à part toutes les autres réponses (qui sont bonnes)Je pense que cela vaut la peine d’examiner ce que Microsoft fait pour des raisons de cohérence ... et les méthodes d’extension dans Enumerable toutes renvoient ArgumentNullException aussi loin que je peux voir.


6 pour la réponse № 3

Comme les méthodes d'extension peuvent être utilisées en C # 2.0 et qu'elles peuvent être appelées comme des méthodes statiques (vous ne devez PAS les utiliser comme méthodes d'extension), vous devez utiliser ArgumentNullException.

Juste parce qu'ils Regardez comme des méthodes sur le type ne signifie pas qu’elles sont ou sont toujours appelées comme telles.


1 pour la réponse № 4

Du point de vue de l'utilisateur, la méthode se présente et se comporte comme une méthode d'instance. Par conséquent, si j'étais leur comportement, je m'attendrais à voir une exception NullReferenceException.

Cela dit, je suggérerais de placer explicitement l'un ou l'autre dans le code, au lieu de simplement "passer" pour en lancer un comme dans votre premier exemple.


1 pour la réponse № 5

ArgumentNullException. Il y a non obligation d'appeler des méthodes d'extension comme s'il s'agissait de méthodes d'instance. Vous pouvez les appeler comme s'il s'agissait de méthodes normales. NullReferenceException serait complètement incorrect dans ce cas.