NOTE : Ceci est différent des doublons proposés car cela traite d'un argument plutôt que d'une valeur. Le comportement et les scénarios applicables sont essentiellement différents.
Disons que nous avons SomeEnum
et avoir une déclaration de commutation qui le gère comme :
enum SomeEnum
{
One,
Two,
}
void someFunc(SomeEnum value)
{
switch(value)
{
case SomeEnum.One:
...
break;
case SomeEnum.Two:
...
break;
default:
throw new ??????Exception("Unhandled value: " + value.ToString());
}
}
Comme vous le voyez, nous gérons toutes les valeurs possibles de l'enum, mais nous conservons une exception par défaut au cas où un nouveau membre serait ajouté et que nous voulions nous assurer que nous sommes conscients du traitement manquant.
Ma question est la suivante : quelle est la bonne exception dans de telles circonstances où vous voulez notifier que le chemin de code donné n'est pas traité/implémenté ou n'aurait jamais dû être visité ? Nous avions l'habitude d'utiliser NotImplementedException
mais ça ne semble pas être la bonne solution. Notre prochain candidat est InvalidOperationException
mais le terme ne sonne pas juste. Quel est le bon terme et pourquoi ?
EDITAR : Introduction de C# 8.0 expressions de commutation qui produisent des avertissements du compilateur pour les instructions de commutation non-exhaustives. C'est une autre raison pour laquelle vous devriez utiliser des expressions switch plutôt que des instructions switch chaque fois que cela est possible. La même fonction peut être écrite d'une manière plus sûre comme :
void someFunc(SomeEnum value)
{
_ = value switch
{
SomeEnum.One => ....,
SomeEnum.Two => ....,
}
}
Quand un nouveau membre est ajouté à SomeEnum
le compilateur affichera l'avertissement "CS8509 : L'expression switch ne gère pas toutes les valeurs possibles de son type d'entrée (elle n'est pas exhaustive). Par exemple, le motif 'EnumHandling.SomeEnum.Three' n'est pas couvert." pour l'expression du commutateur, ce qui facilite grandement la détection des bogues potentiels.