2016-05-02 1 views
0

В одном из моих обработчиков привязки я вызываю внешний ресурс через 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 = ...; 
      .... } 

Спасибо, Нил

ответ

0

Проблема решена, я использовал try от MonadCatchIO-трансформаторов и работал.

 Смежные вопросы

  • Нет связанных вопросов^_^