2016-05-02 47 views
0

在我的一個捕捉處理程序中,我使用http-client通過HTTP調用外部資源,這會引發HttpException。在最簡單的情況下,我只想捕捉錯誤並在調試時寫入標準輸出;不過,我正在經歷一段艱難的時期,纔將這些類型排列起來。在捕捉處理程序中捕獲HTTPException

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

問題解決了,我用從MonadCatchIO變壓器try和工作。