2008-12-31 5 views
1

Dans .NET, quel type d'exception doit être levé si quelqu'un passe une valeur illégale à la partie set { } d'une propriété?Quelle exception doit être générée à partir de l'ensemble de la propriété?

Exemple:

public string Provider 
{ 
    get { return _provider; } 
    set 
    { 
     if (String.IsNullOrEmpty(value)) throw new Exception("Provider cannot be null or empty."); //what type of exception should be thrown here instead? 
     _provider = value; 
    } 
} 

Note:

Je pose cette question car il applique à .NET, mais il pourrait appliquer aussi bien à beaucoup d'autres langues. Donc, si vous avez une bonne réponse qui s'applique à autre chose que le framework .NET, merci de poster!

Répondre

0

Je ne lancerais pas d'exception dans ce cas. Si la propriété est une chaîne, alors je peux la mettre à "" ou null. L'exception doit être levée lorsque j'essaie d'utiliser cette propriété (comme dans une fonction Connect()), avec le message indiquant que la fonction a échoué car la propriété était invalide.

+0

+1 pour la directive de conception –

+0

Pour cet exemple spécifique, cela peut être logique. Si, toutefois, la valeur était utilisée dans le setter pour plus de stockage, je lancerais quand même. – ctacke

+0

@ctacke - le setter ne doit être utilisé que pour le stockage de la valeur. Si plus d'action est nécessaire, une fonction SetProvider (valeur de chaîne) doit être utilisée. –

1

D'une manière générale, je ne suis pas d'accord avec Jon B sur le moment de lancer l'exception - s'il est lancé sur l'appel de set(), il saisira le contexte de la valeur invalide. D'un autre côté, si vous le définissez sur une valeur fictive et que vous lancez l'exception ailleurs, en fonction de l'approche choisie, le client verra la valeur fictive sans indiquer que ce n'est pas la valeur définie, ou recevra une exception qui ne lui donne aucune idée de qui est responsable de l'état invalide ou comment le corriger. Maintenant, dans certaines situations, cette technique peut avoir un sens - si pour une raison inévitable la propriété est extrêmement volatile, et vous avez décidé que c'est bien pour les propriétés illégales à définir de manière transitoire, mais (basé sur une synchronisation externe) le le client n'est pas autorisé à récupérer la propriété tant qu'elle n'est pas reconnue comme étant une valeur légale et stable. Ce n'est pas génial non plus, mais je suis sûr qu'il est possible d'être dans une situation où vous ne pouvez pas aider cette situation.

Et puisque vous avez posé des questions sur les langages autres que .NET, en Java j'utiliserais une exception IllegalArgumentException dans le cas général - peut-être une bonne vieille NullPointerException si l'argument est null.

1

Je suis d'accord avec Andrzej. L'exception doit être lancée dans le "set" car une propriété ne doit jamais être définie sur une valeur non valide et vous devez "capturer le contexte de la valeur invalide"

J'utilise une des classes ArgumentException car "under le capot » un « ensemble » est un appel à une méthode créée automatiquement nommée « CLASSNAME'.set_'PROPERTYNAME »(valeur)

Par exemple

class MyClass 
{ 
    string name; 

    public string Name { 
    get { 
     return name; 
    } 
    set { 
     if (value==null) { 
     throw new ArgumentNullException("value", "The value of the property Name cannot be set to null."); 
     } 
     name = value; 
    } 
    } 

} 

en interne, cela crée deux méthodes

public string get_Name() 

et

public void set_Name(string value) 

Si vous affichez la trace de la pile c'est là l'exception sera levée à partir.

C'est pourquoi j'ai toujours inclure du texte comme "La valeur de la propriété Nom ..."dans le message afin que l'utilisateur de la propriété puisse voir où l'exception a été levée car il n'y aura pas de méthode appelée set_SOMEPROPERTY (valeur SOMETYPE) visible par l'utilisateur de la bibliothèque de classes. Vous êtes supposé faire selon le "NET Framework 4 - Directives de conception pour les exceptions, attraper et lancer les types d'exception standard (Here) À propos de la moitié de la page sous" ArgumentException, ArgumentNullException, et ArgumentOutOfRangeException ", il indique" Do value value for the nom du paramètre de valeur implicite des paramètres de propriété ")

Questions connexes