Yesod中的例外情况

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)

JobMapTMVar Map跟踪当前工作的信息.

所以现在,我所拥有的是处理程序,这看起来都像这样

foo :: Handler RepJson
Run Code Online (Sandbox Code Playgroud)

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

我想要做的是发送一个JSON代表成功的对象,另一个JSON对象,它可以显示有关异常的信息.

我想foo帮助函数能够返回一个Either,但我不知道我是怎么做到的,还有终止评估我的动作列表的能力,buildSeq.

这是我看到的唯一选择

1)确保exceptionHandler在Handler中.将JobMapApp纪录.使用getYesodalter this JobMap指示有关异常的详细信息,然后可以访问该异常foo

有没有更好的办法?

我的其他选择是什么?

编辑:为清楚起见,我将解释其作用Handler RepJson.服务器需要一些方法来接受诸如的命令build stop report.客户端需要某种方式来了解这些命令的结果.我选择JSON作为服务器和客户端相互通信的媒介.我正在使用Handler类型来管理JSON进/出,仅此而已.

Tyl*_*den 10

从哲学上讲,在Haskell/Yesod世界中,你想要向前传递价值,而不是将它们向后传递.因此,不要让处理程序返回值,而是让它们调用转发到进程的下一步,这可能是生成异常.

请记住,您可以将任何数量的未来操作捆绑到单个对象中,这样您就可以将延续对象传递给处理程序和foos,它们基本上告诉他们,"完成后,运行这一段代码." 这样他们就可以无效并且什么也不返回.