当前位置:  开发笔记 > 编程语言 > 正文

Wreq:停止404s抛出异常

如何解决《Wreq:停止404s抛出异常》经验,为你挑选了2个好方法。

我试图测试断开的链接但是,当我使用Wreq的get方法并运行到404时,我得到一个异常(见底部)而不是要处理的statusCode.似乎只返回了200s.

我试图按照教程中的错误处理代码,但我找不到返回相同类型的方法get u.而且,这似乎比我在这种情况下需要的更复杂.

我怎样才能简单地阻止异常并按原样返回responseStatus

verifySeatme :: Maybe URL -> IO UrlStatus
verifySeatme url = do
    case url of
        Nothing -> return None
        Just "" -> return None
        Just u -> do
            seatmeResp <- get u --`E.catch` handler
            -- r ^? responseBody . key "url"
            -- could also check for redirect to errorPage.aspx
            if seatmeResp ^. W.responseStatus . statusCode == 200
            then return (Working u)
            else return Broken
    where
        handler e@(StatusCodeException s respHeaders _) =
            do
                return respHeaders

这是抛出的异常,你可以看到它有我想要的stateCode

*Main> re <- get "https://www.seatme.nl/restaurant/1371/Londen.htm"
*** Exception: StatusCodeException (Status {statusCode = 404, statusMessage = "Not Found"}) [("Cache-Control","private"),....

Yuras建议使用选项,但我无法使用示例使用params到使用选项checkStatus :: Lens' Options (Maybe StatusChecker):

getData :: IO Restos
getData = do
    let opts = defaults & customStatusHandler
    jdata <- asJSON =<< getWith opts "http://localhost/restos-short.json" :: IO Resp
    let
        restos = jdata ^. W.responseBody
    verified <- mapM processEntry restos
    return verified

-- type StatusChecker = Status -> ResponseHeaders -> CookieJar -> Maybe SomeException
customStatusHandler :: W.StatusChecker
customStatusHandler st res _ =
    Just res

Yuras.. 7

注意:答案已过时,请参阅其他答案.

我从未使用过Wreq,但看起来你应该使用getWith传递自定义选项和checkStatus来配置状态处理.

一个例子:

getWith (set checkStatus (Just $ \_ _ _ -> Nothing) defaults)
  "http://google.com/hello/world"

\_ _ _ -> Nothing是一个检查状态代码的函数,请参阅StatusChecker.它不返回任何指示任何状态代码都正常的内容.



1> Yuras..:

注意:答案已过时,请参阅其他答案.

我从未使用过Wreq,但看起来你应该使用getWith传递自定义选项和checkStatus来配置状态处理.

一个例子:

getWith (set checkStatus (Just $ \_ _ _ -> Nothing) defaults)
  "http://google.com/hello/world"

\_ _ _ -> Nothing是一个检查状态代码的函数,请参阅StatusChecker.它不返回任何指示任何状态代码都正常的内容.


谢谢,也谢谢你没有使用中缀运营商

2> 小智..:

为了扩展Evelyn Schneider的答案,我得到了这个

r <- getWith opts url
where 
  opts = set Network.Wreq.checkResponse (Just $ \_ _ -> return ()) defaults

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有