如何处理haskell中的异常

时间:2018-03-31 07:02:15

标签: haskell

postRetweet :: IO [TweetIdStr] -> IO [Status]
postRetweet tweetId = do
    let response1 = tweetId >>= \tweetId1 -> mapM (\tid -> (postWith authenticate (retweetUrl++tid++".json") (DB.pack "ABC"))  ) tweetId1
    response1 >>= \rid -> (mapM (\x -> pure (x^. responseStatus) ) rid)

以上代码是根据tweetId转发推文 如果转发单个推文失败,我会收到例外。如何处理?

使用试试我做了

postRetweet :: IO [TweetIdStr] -> IO [Status]
postRetweet tweetId = do
    tweetId >>= \tweetId1 -> (CM.foldM (\arr tid ->  ((try (postWith authenticate (retweetUrl++tid++".json") (DB.pack "ABC")) ):: IO (Either SomeException (Response BL.ByteString)) ) >>= 
         \sc ->
                case sc of
                    Right val ->   if (val ^. responseStatus ^. statusCode)==200
                                        then pure (arr++[val ^. responseStatus])  
                                    else pure (arr)              
                    Left x -> pure (arr) ) [] tweetId1 )

1 个答案:

答案 0 :(得分:0)

使用try/catch实现异常处理和/或构建可能存在错误的类型,例如: IO (Either Error Result)

请参阅:https://wiki.haskell.org/Handling_errors_in_Haskell