Yesod的例外


93

我创建了一个使用非常原始形式的守护程序ipc(远程登录并发送具有按特定顺序包含某些单词的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 ()

buildSeq中的每个函数如下所示

foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap

JobMapTMVar Map跟踪有关当前作业的信息。

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

foo :: Handler RepJson

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

我想做的是发送一个JSON代表成功的对象,以及另一个JSON对象,该对象表达有关某些异常的信息。

我希望foos的辅助函数能够返回Either,但是我不确定如何获得该函数,以及能够终止对动作列表进行评估的功能buildSeq

这是我唯一的选择

1)确保exceptionHandler在Handler中。将JobMapApp纪录。通过使用getYesodalternate适当的值来JobMap指示有关异常的详细信息,然后可以由foo

有没有更好的办法?

我还有其他选择吗?

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

Answers:


9

从哲学上讲,在Haskell / Yesod世界中,您希望向前传递值,而不是向后返回。因此,与其让处理程序返回一个值,不如让处理程序将其调用前进到过程的下一步,这可能是生成异常。

请记住,您可以将任何数量的将来操作捆绑到一个对象中,因此您可以将延续对象传递给您的处理程序和foo,这些处理程序和foo基本上告诉他们:“完成之后,运行此代码块”。这样,它们可以无效并且什么也不返回。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.