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 ?