阅读有关如何捕捉这种情况发生在单子栈(here和here)异常之后,我发现了库exceptions
这似乎易于使用。
我读到这类型Yesod
实现了Exception
型类,原来这是一个叫HandlerContents
类型:
data HandlerContents =
HCContent H.Status !TypedContent
| HCError ErrorResponse
| HCSendFile ContentType FilePath (Maybe FilePart)
| HCRedirect H.Status Text
| HCCreated Text
| HCWai W.Response
| HCWaiApp W.Application
deriving Typeable
我感兴趣的HCError
,因为它包含ErrorResponse
(相同类型的errorHandler
获得) 。
我在我的cabal文件中添加了exceptions
库到build-depends
。我在API中的所有处理过:: Handler Value
所以我创建了一个效用函数签名称为catchRouteError
是我能与运行我的处理程序:
catchRouteError :: Handler Value -> Handler Value
catchRouteError r = catch r handleError
where
handleError :: HandlerContents -> Handler Value
handleError (HCError (InvalidArgs _)) = ... create specific json error
handleError (HCError _) = ... create generic json error
handleError e = throwM e
由于HandlerContents
用于其他事情,如重定向和接收文件,我只能匹配HCError
并让默认实现处理其他所有内容。
现在,我可以很容易地使用该功能运行我的处理程序:
postAPIAppStatusR :: Handler Value
postAPIAppStatusR = catchRouteError $ do
...
这是一个快速解决我的问题,我敢肯定有一些人更好的了解Yesod
可以提供更优雅的解决方案。也许你 -
酷!下次我会在我的项目中碰到yesod版本时会考虑这个问题。谢谢! – rzetterberg 2014-10-20 13:53:33
为了记录,该功能已经存在了一段时间。 – 2014-10-20 14:33:10
更好:)我接受这个答案,因为它是Yesod中已经存在的解决方案。 – rzetterberg 2014-10-21 06:24:02