Je récupère des milliers d'entités à partir d'une API une à la fois en utilisant des requêtes http. Comme la prochaine étape dans le pipeline, je veux tous les ramasser dans une base de données.Erreur idiomatique/gestion des exceptions avec des macros de threads
(->> ids
(pmap fetch-entity)
(pmap store-entity)
(doall))
fetch-entity
attend un identifiant String
et tente de récupérer une entité à l'aide d'une requête HTTP et renvoie soit un Map
ou déclenche une exception (par exemple en raison d'un délai d'attente).
store-entity
attend un Map
et tente de le stocker dans une base de données. Il peut éventuellement générer une exception (par exemple, si le Map
ne correspond pas au schéma de base de données ou s'il n'a pas reçu de Map
).
erreur inélégant Handling
Ma première « solution » est d'écrire des fonctions wrapper fetch-entity'
et store-entity'
pour intercepter des exceptions de leurs fonctions originales respectives.
fetch-entity'
renvoie son entrée en cas d'échec, en passant essentiellement un String
id si la demande http a échoué. Cela garantit que l'ensemble du pipeline conserve le camionnage.
store-entity'
vérifie le type de son argument. Si l'argument est Map
(l'entité d'extraction a réussi et a renvoyé un Map
), elle tente de le stocker dans la base de données.
Si la tentative de stockage de la base de données génère une exception ou si store-entity'
a obtenu un passé String
(id) au lieu d'un Map
il sera conj
à un Vector
externe de error_ids
.
De cette façon, je peux plus tard utiliser error_ids
pour savoir combien de fois il y avait un échec et quels identifiants ont été affectés.
Il ne me semble pas que ce qui précède est un moyen sensé de réaliser ce que j'essaie de faire. Par exemple, la façon dont j'ai écrit store-entity'
complique la fonction avec l'étape précédente du pipeline (fetch-entity'
) car elle se comporte différemment selon que l'étape précédente du pipeline a réussi ou non.
Egalement ayant store-entity'
être conscient d'un Vector
externe appelé error_ids
ne se sent pas du tout. Existe-t-il une manière idiomatique de gérer ce genre de situations où vous avez plusieurs étapes de pipeline où certaines d'entre elles peuvent lancer des exceptions (par exemple parce qu'elles sont des E/S) où je ne peux pas facilement utiliser les prédicats se comportera de manière prévisible et où je ne veux pas déranger le pipeline et seulement vérifier plus tard dans quels cas il a mal tourné?
Avez-vous regardé: http s: //github.com/adambard/failjure? –