Excepciones en Yesod

Había hecho un demonio que usaba una forma muy primitiva deipc (Telnet y enviar una cadena que tenía ciertas palabras en un cierto orden). Salí de él y ahora estoy usandoJSON pasar mensajes a unYesod servidor. Sin embargo, hubo algunas cosas que realmente me gustaron de mi diseño, y no estoy seguro de cuáles son mis opciones ahora.

Esto es lo que estaba haciendo:

<code>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 ()
</code>

cada función en buildSeq se veía así

<code>foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap
</code>

JobMap es unTMVar Map que rastrea información sobre trabajos actuales.

así que ahora, lo que tengo son manejadores, que todos se ven así

<code>foo :: Handler RepJson
</code>

foo representa un comando para mi demonio, cada controlador puede tener que procesar un objeto JSON diferente.

Lo que me gustaría hacer es enviar uno.JSON objeto que representa el éxito y otro objeto JSON que expresa información sobre alguna excepción.

Me gustaríafoos función de ayuda para poder devolver unaEither, pero no estoy seguro de cómo obtengo eso, más la capacidad de terminar la evaluación de mi lista de acciones,buildSeq.

Aquí está la única opción que veo

1) asegurarseexceptionHandler Está en Handler. PonerJobMap en elApp grabar. UtilizandogetYesod alterar el valor apropiado enJobMap indicando detalles sobre la excepción, a la que luego se puede acceder porfoo

¿Hay alguna manera mejor?

¿Cuáles son mis otras opciones?

Edit: Para mayor claridad, explicaré el papel deHandler RepJson. El servidor necesita alguna forma de aceptar comandos comobuild stop report. El cliente necesita alguna forma de conocer los resultados de estos comandos. He elegido JSON como el medio con el que el servidor y el cliente se comunican entre sí. Estoy usando el tipo Handler solo para administrar el JSON in / out y nada más.

Respuestas a la pregunta(1)

Su respuesta a la pregunta