閱讀有關如何捕捉這種情況發生在單子棧(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