11 votes

Quel type d'exception pour les chaînes de caractères ?

Si j'ai ce qui suit, en fait pour toute chaîne de caractères pour laquelle vous vérifiez IsNullOrEmpty et qui s'avère être vide, quel type d'exception doit-on lancer, et ce n'est pas un argument pour une méthode ?

J'ai toujours du mal à choisir les types d'exception car il y en a tellement. Il s'agit simplement d'extraire une valeur du web.config et de vérifier si SandboxSoapApiUsername est vide.

if(string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername))
        throw new WTF do I throw here??? ahhh

Cela dépend probablement de l'utilisation/du contexte, non ? Eh bien, je vais utiliser la chaîne retournée pour définir un champ privé de classe. Je dois donc vérifier si la chaîne est vide au début du processus plutôt que plus tard (plutôt que de compter sur un autre code pour vérifier la propriété liée au champ privé que je vais définir ConfigUtility.SandboxSoapApiUsername).

Étant donné que les propriétés de cette classe auxquelles j'attribue chaque ConfigUtility.MEthodName vont être utilisées dans une requête SOAP, je me suis dit qu'une UriFormatException serait peut-être appropriée ici, même si ce n'est pas l'Uri ?

12voto

dtb Points 104373

Les méthodes du .NET Framework font généralement la distinction entre null et une valeur invalide passée en argument. Je pense que vous devriez lever une ArgumentNullException si la valeur est nulle et une ArgumentException si elle est invalide.

if (arg == null)
    throw new ArgumentNullException("arg", "argcannot be null");
if (arg == string.Empty)
    throw new ArgumentException("arg cannot be an empty string", "arg");

Si la valeur n'est pas un argument, mais, par exemple, chargée pendant l'initialisation, je pense qu'une InvalidOperationException serait appropriée :

if (string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername))
    throw new InvalidOperationException("Cannot initialize because " +
                                        "SandboxSoapApiUsername not configured");

10voto

blowdart Points 28735

Cela dépend de la provenance de la ficelle. Un argument peut provoquer une exception ArgumentNullException. La configuration peut provoquer une ConfigurationException (qui semble s'appliquer à ce cas). Vous pouvez bien sûr créer votre propre exception de toute façon.

7voto

Chris S Points 32376

Vous passerez vraiment la plupart de votre temps à choisir parmi la liste ci-dessous lorsque vous lancez un new (par opposition à la simple exécution d'une throw ).

  1. ConfigurationException
    • L'exception qui est levée lorsqu'une erreur du système de configuration s'est produite.
  2. ArgumentException
    • L'exception qui est levée lorsque l'un des arguments fournis à une méthode n'est pas valide.
  3. InvalidOperationException
    • L'exception qui est levée lorsqu'un appel de méthode n'est pas valide pour l'état actuel de l'objet.

1)
Cela n'a sans doute aucun sens, à moins que vous ne choisissiez le paramètre dans un app.config ou un web.config :

L'exception ConfigurationException est levée si l'application tente de lire ou d'écrire des données dans le fichier de configuration, mais n'y parvient pas. mais n'y parvient pas. Parmi les raisons possibles peuvent inclure un XML malformé dans le fichier dans le fichier de configuration, une fichiers, des problèmes d'autorisation, et des de configuration dont les valeurs ne sont pas valides.

2)
Ce n'est pas un argument, donc celui-là n'a pas beaucoup de sens.

3)
C'est la meilleure des trois car l'objet sera dans un état invalide. Cependant, en fonction de la taille de votre ensemble de paramètres de configuration, je préférerais créer ma propre exception dérivée de System.Exception .

Il y a deux écoles de pensée sur ce qu'il faut en tirer - System.Exception y ApplicationException *. Deux développeurs différents de l'équipe chargée du framework ont exprimé des points de vue différents sur ce dont il faut hériter. Le point de vue de Jeffrey Richter .

Si tout ce qui précède ressemble à du woffle, vous pouvez choisir celui qui vous semble le plus pertinent parmi les suivants la liste .

*Il semble que MSDN soit maintenant d'accord avec les développeurs de son cadre de travail pour dire que ApplicationException était une erreur de conception.

4voto

pm100 Points 8303

Vous avez besoin d'une exception InvalidConfiguration - définissez-en une

 throw new InvalidConfigurationException("Must supply user name")

1voto

Kevin Montrose Points 11936

S'il est passé comme argument, il lance ArgumentNullException .

Sinon, cela dépend vraiment de ce que la chaîne étant null signifie dans le contexte de votre application. N'ayez pas peur de définir des types d'exception personnalisés si le cadre de base ne contient rien pour ce scénario.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X