json - Yesod 中的异常(exception)情况

标签 json haskell exception-handling yesod

我制作了一个使用非常原始形式的 ipc 的守护程序(telnet 并发送一个字符串,其中包含按特定顺序的特定单词)。我摆脱了它,现在使用 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

JobMap 是一个 TMVar Map,用于跟踪有关当前作业的信息。

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

foo :: Handler RepJson

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

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

我希望 foo 的辅助函数能够返回 Either,但我不确定我是如何得到它的,以及终止对我的操作列表,buildSeq

这是我看到的唯一选择

1) 确保 exceptionHandler 在 Handler 中。将 JobMap 放入 App 记录中。使用 getYesod 更改 JobMap 中的适当值,指示有关异常的详细信息, 然后可以通过 foo

访问

有没有更好的办法?

我还有哪些其他选择?

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

最佳答案

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

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

关于json - Yesod 中的异常(exception)情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133448/

相关文章:

javascript - 对具有数组的 Son 数据进行 Angular ng-repeat

php - PHP 基础知识中的 Json 解码

java - 对 REST 端点进行单元测试的最佳方法是什么( Jersey )

haskell - 新手 haskell - 顺序 monad 绑定(bind)

javascript - 关于如何与 Mongoose 创建关系的简单说明

haskell - 使用多个参数类型类时 Haskell 中的模棱两可的类型变量

opengl - 在 OpenGL 中设置统一

exception-handling - 如何实现顶级异常处理?

vb.net - 将未处理的异常记录到日志文件

exception-handling - 如何在 ASP.NET Core 中正确实现 ExceptionFilterAttribute