2 votes

Propagation correcte des erreurs en clojure

Je travaille actuellement sur mon premier grand projet en clojure et j'ai rencontré une question concernant le style de codage et la manière la plus "clojure-esque" de faire quelque chose. Fondamentalement, j'ai une fonction que j'écris qui prend une structure de données et un modèle que la fonction va essayer de masser la structure de données dans. La structure du modèle ressemble à quelque chose comme ceci :

{
:key1 (:string (:opt :param))
:key2 (:int (:opt :param))
:key3 (:obj (:tpl :template-structure))
:key4 (:list (:tpl :template-structure))
}

Chaque clé est un atome qui sera recherché dans la structure de données donnée, et sa valeur sera tentée de correspondre au type donné dans la structure du modèle. Ainsi, on cherchera :key1 et vérifier que c'est une chaîne de caractères, par exemple. La valeur de retour serait une carte qui a :key1 pointant vers la valeur de la structure de données donnée (la fonction peut potentiellement changer la valeur en fonction des options données).

Dans le cas de :obj il prend une autre structure de modèle, et s'appelle récursivement sur cette valeur et la structure de modèle, et place le résultat de cela dans le retour. Cependant, s'il y a une erreur, je veux que cette erreur soit renvoyée directement.

De même, pour les listes, je veux qu'elles fassent une carte de la fonction à nouveau, sauf dans le cas d'une erreur que je veux renvoyer directement.

Ma question est la suivante : quelle est la meilleure façon de traiter ces erreurs ? Une simple gestion des exceptions serait le moyen le plus simple, mais je pense que ce n'est pas le moyen le plus fonctionnel. Je pourrais essayer de garder les erreurs tout au long de la chaîne avec des tonnes d'instructions if, mais cela ne semble pas non plus très sportif. Y a-t-il quelque chose de simple qui m'échappe ou est-ce simplement un problème laid ?

4voto

amalloy Points 29125

Vous pourriez être intéressé par Schéma qui fait des choses assez similaires. Vous pouvez voir comment il est utilisé dans la section tests et le mise en œuvre .

En gros, j'ai défini un error qui renvoie nil pour des données correctement formatées, ou une chaîne décrivant l'erreur. L'utilisation d'exceptions rendrait la plomberie plus facile, mais il serait plus difficile d'obtenir les messages d'erreur détaillés tels que "[person: [first_name: expected string, got integer]]" .

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