В одном из моих обработчиков привязки я вызываю внешний ресурс через HTTP с помощью http-client, который может вызывать HttpException
. В простейшем случае я просто хочу поймать ошибку и написать в std, пока я отлаживаю; Тем не менее, я испытываю трудности с получением типов, выстроенных в линию.Поймать HTTPException в Snap Handler
assignCategories' :: String -> [String] -> Handler App (AuthManager App) String
assignCategories' l_id cats = do
let baseAttribs = M.fromList [("id",l_id)]
let saveQuery = WMSaveObject {baseAttributesSO= baseAttribs ,relatedSO=relatedObjects}
-- this is the function that can throw an HTTPException
-- runWMSave :: WMQueryObj -> Handler App (AuthManager App) String
saveresponse <- try $ H.runWMSave saveQuery
return $ case saveresponse of
Left e -> show (e :: HttpException)
Right r -> r
Я играл с типами, но я обычно получаю ошибки как ниже ... есть лучшая практика для вызова HTTP в обработчике и отлов исключения?
Я использую Control.Monad.Catch. Я пробовал использовать Control.Exception try
, но было еще больше трудностей при создании типов.
No instance for (Control.Monad.Catch.MonadCatch
(Handler App (AuthManager App)))
arising from a use of ‘try’
In the expression: try
In a stmt of a 'do' block:
saveresponse <- try $ H.runWMSave saveQuery
In the expression:
do { liftIO $ putStrLn l_id;
let baseAttribs = M.fromList ...;
let relatedObjects = concatMap makeRelatedRow cats;
let saveQuery = ...;
.... }
Спасибо, Нил