Mic*_*ard 94 json haskell exception-handling yesod
我做了一个守护进程,它使用了一种非常原始的形式ipc(telnet并发送一个按特定顺序排列某些单词的String).我抢购了它,现在JSON用来将消息传递给Yesod服务器.但是,有一些我真的很喜欢我的设计,我不确定我现在的选择.
这就是我在做的事情:
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 ()
Run Code Online (Sandbox Code Playgroud)
buildSeq中的每个函数都是这样的
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
Run Code Online (Sandbox Code Playgroud)
JobMap是TMVar Map跟踪当前工作的信息.
所以现在,我所拥有的是处理程序,这看起来都像这样
foo :: Handler RepJson
Run Code Online (Sandbox Code Playgroud)
foo 表示我的守护进程的命令,每个处理程序可能必须处理不同的JSON对象.
我想要做的是发送一个JSON代表成功的对象,另一个JSON对象,它可以显示有关异常的信息.
我想foo帮助函数能够返回一个Either,但我不知道我是怎么做到的,还有终止评估我的动作列表的能力,buildSeq.
这是我看到的唯一选择
1)确保exceptionHandler在Handler中.将JobMap在App纪录.使用getYesodalter this JobMap指示有关异常的详细信息,然后可以访问该异常foo
有没有更好的办法?
我的其他选择是什么?
编辑:为清楚起见,我将解释其作用Handler RepJson.服务器需要一些方法来接受诸如的命令build stop report.客户端需要某种方式来了解这些命令的结果.我选择JSON作为服务器和客户端相互通信的媒介.我正在使用Handler类型来管理JSON进/出,仅此而已.
Tyl*_*den 10
从哲学上讲,在Haskell/Yesod世界中,你想要向前传递价值,而不是将它们向后传递.因此,不要让处理程序返回值,而是让它们调用转发到进程的下一步,这可能是生成异常.
请记住,您可以将任何数量的未来操作捆绑到单个对象中,这样您就可以将延续对象传递给处理程序和foos,它们基本上告诉他们,"完成后,运行这一段代码." 这样他们就可以无效并且什么也不返回.