.NET: quelle exception lancer lorsqu’un paramètre de configuration requirejs est manquant?

Voici un scénario standard:

if(ssortingng.IsNullOrEmpty(Configuration.AppSettings["foobar"])) throw new SomeStandardException("Application not configured correctly, bozo."); 

Le problème est que je ne suis pas tout à fait sûr de quelle exception SomeStandardException devrait être.

J’ai parcouru le 3.5 Framework et trouvé deux candidats probables: ConfigurationException et ConfigurationErrorsException .

System.Configuration.ConfigurationException

L’exception qui est levée lorsqu’une erreur du système de configuration s’est produite.

Remarques

L’exception ConfigurationException est déclenchée si l’application tente de lire ou d’écrire des données dans le fichier de configuration mais qu’elle échoue. Certaines raisons possibles peuvent inclure un XML mal formé dans le fichier de configuration, des problèmes d’autorisation de fichier et des propriétés de configuration avec des valeurs non valides.

Remarque:

L’object ConfigurationException est maintenu pour assurer la compatibilité ascendante. L’object ConfigurationErrorsException remplace pour le système de configuration.

Cette exception semble en fait parfaite pour ce dont j’ai besoin, mais elle a été marquée comme obsolète, alors, ixnay on atthay.

Cela nous amène à une exception déroutante ConfigurationErrorsException :

System.Configuration.ConfigurationErrorsException

La valeur actuelle ne fait pas partie des valeurs EnableSessionState.

Comme vous pouvez le voir, sa documentation est totalement inutile. (C’est comme cela dans l’aide locale et en ligne.) Un examen du cours lui-même montre que c’est exagéré pour ce que je veux.

En bref, j’ai besoin d’une exception standard qui doit être levée lorsqu’un paramètre de configuration d’application est manquant ou contient une valeur non valide. Vous pensez que le Framework a une telle exception pour les applications à utiliser. (Il a apparemment fait, mais il a été marqué comme obsolète, et a été remplacé par quelque chose de beaucoup plus large.)

Quelles solutions utilisez-vous, le cas échéant, pour cela, et vais-je devoir les aspirer et lancer ma propre exception pour cela?

Modifier les addenda

Certains ont demandé si je pouvais ou non fournir une valeur par défaut et continuer. Dans certains cas, oui, et dans ces cas, l’exception ne sera pas levée. Cependant, pour certains parameters, cela ne s’appliquera pas. Par exemple: noms et informations d’identification du serveur de firebase database, serveurs d’authentification et chemins d’access aux applications tierces installées.

Il convient également de noter que l’application sur laquelle je travaille principalement est une application console exécutée en mode de traitement par lots et que je souhaite qu’elle génère une exception détectée par la méthode principale et consignée de manière appropriée si la configuration n’est pas appropriée. (C’est le code hérité dont j’ai hérité et qui, à l’heure actuelle, prend tout pour acquis.)

Vous n’êtes pas limité dans vos exceptions aux exceptions existantes dans le Framework. Si vous décidez d’utiliser des exceptions existantes, vous ne devez absolument pas suivre la documentation à la lettre. La documentation décrira comment l’ infrastructure utilise une exception donnée, mais n’implique aucune limitation quant à la manière dont vous choisissez d’utiliser / réutiliser une exception existante.

C’est votre application – tant que vous la documentez et indiquez clairement l’exception qui sera lancée dans le cas spécifique d’une valeur de configuration manquante, vous pouvez utiliser n’importe quelle exception. Si vous souhaitez une indication très spécifique d’une valeur manquante , vous pouvez envisager d’écrire votre propre exception ConfigurationSettingMissing:

 [Serializable] public class ConfigurationMissingException : ConfigurationErrorsException {} 

EDIT: Ecrire votre propre exception dans ce cas présente l’avantage supplémentaire de garantir qu’il n’y aura jamais de confusion en ce qui concerne la provenance de l’exception – le framework ou votre application. Le framework ne lancera jamais vos exceptions personnalisées.

MISE À JOUR: Je suis d’accord avec les commentaires, j’ai donc changé la sous-classe à ConfigurationErrorsException de Exception. Je pense que c’est généralement une bonne idée de sous-classer les exceptions personnalisées des exceptions Framework existantes, en évitant la classe Exception sauf si vous avez besoin d’une exception spécifique à l’application.

Personnellement, j’utiliserais InvalidOperationException , car c’est un problème avec l’état de l’object – pas le système de configuration. Après tout, ne devriez-vous pas permettre que ces parameters soient définis par le code et non par la configuration? La partie importante ici n’est pas qu’il n’y avait pas de ligne dans app.config, mais qu’une information requirejse n’était pas présente.

Pour moi, ConfigurationException (et son remplacement, ConfigurationErrorsException – malgré les documents MSDN trompeurs) concernent les erreurs d’enregistrement, de lecture, etc. de la configuration.

Comme l’a dit Daniel Richardson, ConfigurationErrorsException est celui à utiliser. En général, il est recommandé de créer vos propres types d’exception personnalisés si vous avez un scénario pour les gérer. Dans le cas d’erreurs de configuration, qui sont généralement fatales, c’est rarement le cas, il est donc généralement plus approprié de réutiliser le type ConfigurationErrorsException existant.

Avant .NET 2.0, la recommandation était d’utiliser System.Configuration.ConfigurationException . ConfigurationException est devenu obsolète dans .NET 2.0, pour des raisons qui n’ont jamais été claires pour moi, et la recommandation a été modifiée pour utiliser ConfigurationErrorsException.

J’utilise une méthode d’assistance pour lancer l’exception afin qu’il soit facile de modifier l’exception lancée à un endroit lors de la migration de .NET 1.x vers la version 2.0 ou si Microsoft décide de modifier à nouveau la recommandation:

 if(ssortingng.IsNullOrEmpty(Configuration.AppSettings("foobar"))) { throw CreateMissingSettingException("foobar"); } ... private static Exception CreateMissingSettingException(ssortingng name) { return new ConfigurationErrorsException( Ssortingng.Format ( CultureInfo.CurrentCulture, Properties.Resources.MissingConfigSetting, name ) ); } 

Qu’en est-il de System.Configuration.SettingsPropertyNotFoundException?

ConfigurationErrorsException est l’exception correcte à inclure dans la situation que vous décrivez. Une version antérieure de la documentation MSDN pour ConfigurationErrorsException est plus logique.

http://msdn.microsoft.com/en-us/library/system.configuration.configurationerrorsexception(VS.80).aspx

Le résumé MSDN et les remarques antérieurs sont les suivants:

  • L’exception est levée lorsqu’une erreur du système de configuration s’est produite.
  • L’exception ConfigurationErrorsException est renvoyée en cas d’erreur lors de la lecture ou de l’écriture des informations de configuration.

La classe ConfigurationElement (qui est la classe de base de nombreuses classes liées à la configuration, comme ConfigurationSection) possède une méthode appelée OnRequiredPropertyNotFound (il existe également d’autres méthodes d’assistance). Vous pouvez peut-être les appeler.

Le OnRequiredPropertyNotFound est implémenté comme ceci:

 protected virtual object OnRequiredPropertyNotFound(ssortingng name) { throw new ConfigurationErrorsException(SR.GetSsortingng("Config_base_required_atsortingbute_missing", new object[] { name }), this.PropertyFileName(name), this.PropertyLineNumber(name)); } 

Je le suce et roule moi-même … mais avant cela, est-il possible que le système assume une valeur par défaut pour ce paramètre de configuration? J’essaie généralement de le faire pour tous les parameters qui pourraient être manqués par les utilisateurs d’Ops Management … (ou peut-être devrais-je dire pour autant de parameters que possible). ..)

En général, une exception personnalisée ne demande pas beaucoup d’efforts … voici un exemple …

 [Serializable] public class MyCustomApplicationException : ApplicationException { #region privates #endregion privates #region properties #endregion properties public MyCustomApplicationException (ssortingng sMessage, Exception innerException) : base(sMessage, innerException) { } public MyCustomApplicationException (ssortingng sMessage) : base(sMessage) { } public MyCustomApplicationException () { } #region Serializeable Code public MyCustomApplicationException ( SerializationInfo info, StreamingContext context) : base(info, context) { } #endregion Serializeable Code } 

Une autre méthode que vous pourriez utiliser pour vos fichiers de configuration serait d’utiliser des sections de configuration personnalisées par opposition à AppSettings . De cette façon, vous pouvez spécifier qu’une propriété IsRequired et le système de configuration gèrent cette vérification pour vous. Si la propriété est manquante, une exception ConfigurationErrorsException sera lancée. Je suppose donc que la réponse est que vous devez utiliser cette exception dans votre cas.

Ma règle générale serait:

  1. Si le cas de la configuration manquante n’est pas très courant et que je pense que je ne voudrais jamais gérer ce cas différemment des autres exceptions, j’utilise simplement la classe de base “Exception” avec un message approprié:

    lancer une nouvelle exception (“mon message ici”)

  2. Si je veux ou si je pense qu’il y a une forte probabilité que je veuille traiter ce cas d’une manière différente de la plupart des autres exceptions, je lancerais mon propre type, comme les gens l’ont déjà suggéré ici.

J’ai tendance à être en désaccord avec la prémisse de votre question:

En bref, j’ai besoin d’une exception standard qui doit être levée lorsqu’un paramètre de configuration d’application est manquant ou contient une valeur non valide. Vous pensez que le Framework a une telle exception pour les applications à utiliser. (Il a apparemment fait, mais il a été marqué comme obsolète, et a été remplacé par quelque chose de beaucoup plus large.)

Selon la documentation MSDN sur System.Exception ( Exception Class , vous ne devriez vraiment pas lancer d’exceptions pour les erreurs de saisie utilisateur, pour des raisons de performances (ce qui a été signalé par Stack Overflow et ailleurs). Cela semble logique. Eh bien – pourquoi votre fonction ne peut-elle pas retourner false si l’entrée de l’utilisateur est entrée de manière incorrecte et que l’application se termine normalement? Cela semble être davantage un problème de conception qu’un problème avec lequel Exception à lancer.

Comme d’autres l’ont fait remarquer, si vous devez vraiment lancer une exception – pour quelque raison que ce soit – il n’ya aucune raison pour laquelle vous ne pouvez pas définir votre type d’exception en héritant de System.Exception.

Vous pouvez essayer d’hériter de l’exception XML ou de l’utiliser.