94 votes

Exceptions dans Yesod

J'avais fait un démon qui a utilisé un très primitifs ipc (telnet et d'envoyer une Chaîne de caractères qui avait certains mots dans un certain ordre). J'ai craqué et suis maintenant en utilisant JSON de transmettre des messages à un Yesod serveur. Cependant, il y avait certaines choses que j'ai vraiment aimé mon dessin, et je ne suis pas sûr de ce que mes choix sont maintenant.

Voici ce que je faisais:

buildManager :: Phase -> IO ()
buildManager phase = do
  let buildSeq = findSeq phase
      jid = JobID $ pack "8"
      config = MkConfig $ Just jid
  flip C.catch exceptionHandler $ 
  runReaderT (sequence_ $ buildSeq <*> stages) config
  -- ^^ I would really like to keep the above line of code, or something like it.
  return ()

chaque fonction dans buildSeq ressemblait à ça

foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap

JobMap est TMVar Map que des pistes d'informations sur les travaux en cours.

alors maintenant, ce que j'ai sont des Gestionnaires, que tous ressembler à ceci

foo :: Handler RepJson

foo représente une commande pour mon démon, chaque gestionnaire peut avoir besoin de traiter un autre objet JSON.

Ce que je voudrais faire est d'envoyer un JSON objet qui représente le succès, et un autre objet JSON qui espresses d'informations sur certains exception.

Je voudrais foos fonction d'assistance pour être en mesure de retourner un Either, mais je ne suis pas sûr de savoir comment j'obtiens ce que, en plus de la possibilité de mettre fin à l'évaluation de ma liste d'actions, buildSeq.

Voici le seul choix que je vois

1) assurez - exceptionHandler est dans le Gestionnaire. Mettre JobMap dans la App record. À l'aide de getYesod modifier la valeur appropriée en JobMap indiquant des informations sur l'exception, qui peut ensuite être consulté par foo

Est-il un meilleur moyen?

Quels sont mes choix?

Edit: Pour plus de clarté, je vais vous expliquer le rôle de l'Handler RepJson. Le serveur a besoin d'un moyen d'accepter des commandes telles que build stop report. Le client a besoin d'un moyen de connaître les résultats de ces commandes. J'ai choisi de JSON comme le medium avec lequel le serveur et le client de communiquer les uns avec les autres. Je suis en utilisant le Gestionnaire de type juste pour gérer le JSON/et rien de plus.

10voto

Tyler Durden Points 4349

Philosophiquement parlant, dans le Haskell/Yesod monde que vous voulez transmettre les valeurs de l'avant, plutôt que de revenir en arrière. Alors au lieu d'avoir les gestionnaires de retourner une valeur, demandez-leur d'appel transmet à l'étape suivante dans le processus, ce qui peut générer une exception.

N'oubliez pas que vous pouvez regrouper toute quantité d'actions futures en un objet unique, de sorte que vous pouvez passer une poursuite de l'objet à vos gestionnaires et foos que, fondamentalement, leur dit, "Après vous avez terminé, exécutez cette goutte de code". De cette façon, ils peuvent être annulés et les renvoyer rien.

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