Yesod的例外
我做了一个守护进程,使用一个非常原始的ipc
forms(远程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
放入App
logging中。 使用getYesod
改变getYesod
中适当的值,指出有关exception的细节,然后可以通过foo
访问
有没有更好的办法?
我的其他select是什么?
编辑:为了清晰起见,我将解释Handler RepJson
的作用。 服务器需要一些方法来接受诸如build
stop
report
命令。 客户端需要一些方法来了解这些命令的结果。 我select了JSON作为服务器和客户端通信的媒介。 我使用的处理程序types只是为了pipe理JSONinput/输出,没有更多。
从哲学的angular度来说,在Haskell / Yesod世界中,你希望将价值向前传递,而不是将它们退回。 因此,不要让处理程序返回一个值,而是让它们调用进程中的下一个步骤,这可能会产生一个exception。
请记住,您可以将任何数量的未来操作绑定到单个对象中,因此您可以将连续对象传递给您的处理程序和foos,基本上告诉他们:“完成后,运行这个代码块。 这样他们可以是无效的,什么都不返回。