json - Yesod中的例外情况

收藏

我制作了一个守护进程,它使用非常原始的形式(telnet和send a string),以特定的顺序发送某些单词。我突然跳出了它,现在正在使用ipc将消息传递到JSON服务器。然而,在我的设计中有一些我真正喜欢的东西,我不确定我现在的选择是什么。
我正在做的是:

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

Yesod是跟踪当前作业信息的JobMap
所以现在,我有了一些处理程序,它们看起来都是这样的。
foo :: Handler RepJson

TMVar Map表示我的守护进程的命令,每个处理程序可能必须处理不同的JSON对象。
我要做的是发送一个代表成功的对象,以及另一个支持有关异常的信息的JSON对象。
我希望foos helper函数能够返回一个JSON,但我不确定如何得到它,加上终止对我的操作列表的评估的能力,foo
这是我看到的唯一选择
1)确保Either在handler中。将buildSeq放入exceptionHandler记录中。使用JobMap更改App中指示异常详细信息的适当值,
然后可以通过getYesod
有更好的方法吗?
我的其他选择是什么?
编辑:为了清楚起见,我将解释JobMap的作用。服务器需要某种方式来接受命令,如fooHandler RepJson。客户机需要某种方式来了解这些命令的结果。我选择JSON作为服务器和客户机相互通信的媒介。我使用处理程序类型只是为了管理JSON输入/输出,而不是其他任何东西。


最佳答案:

从哲学上讲,在haskell/yesod世界中,你希望向前传递价值观,而不是向后返回价值观。因此,不要让处理程序返回值,而是让它们调用流程中的下一步,这可能是生成异常。
记住,您可以将任何数量的未来操作捆绑到单个对象中,这样您就可以将一个延续对象传递给处理程序和foo,它们基本上告诉它们,“完成后,运行这个代码块”。这样,它们就可以是无效的,不会返回任何内容。