Yesod的例外

我做了一个守护进程,使用一个非常原始的ipcforms(远程login并发送一个string,按照一定的顺序有一定的字)。 我退出了它,现在使用JSON将消息传递给Yesod服务器。 不过,有些事情我真的喜欢我的devise,我不确定我现在的select。

以下是我正在做的事情:

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

buildSeq中的每个函数都是这样的

 foo :: Stage -> ReaderT Config IO () data Config = MkConfig (Either JobID Product) BaseDir JobMap 

JobMap是跟踪当前作业信息的TMVar Map

所以现在,我所拥有的Handlers,都是这样的

 foo :: Handler RepJson 

foo代表我的守护进程的命令,每个处理程序可能必须处理不同的JSON对象。

我想要做的是发送一个代表成功的JSON对象,以及另一个JSON对象,这个JSON对象表示一些exception的信息。

我希望foo的帮助函数能够返回一个Either ,但我不知道我是如何得到的,再加上终止评估我的行动列表buildSeq

这是我看到的唯一select

1)确保exceptionHandler在Handler中。 将JobMap放入Applogging中。 使用getYesod改变getYesod中适当的值,指出有关exception的细节,然后可以通过foo访问

有没有更好的办法?

我的其他select是什么?

编辑:为了清晰起见,我将解释Handler RepJson的作用。 服务器需要一些方法来接受诸如build stop report命令。 客户端需要一些方法来了解这些命令的结果。 我select了JSON作为服务器和客户端通信的媒介。 我使用的处理程序types只是为了pipe理JSONinput/输出,没有更多。

从哲学的angular度来说,在Haskell / Yesod世界中,你希望将价值向前传递,而不是将它们退回。 因此,不要让处理程序返回一个值,而是让它们调用进程中的下一个步骤,这可能会产生一个exception。

请记住,您可以将任何数量的未来操作绑定到单个对象中,因此您可以将连续对象传递给您的处理程序和foos,基本上告诉他们:“完成后,运行这个代码块。 这样他们可以是无效的,什么都不返回。