Haskell Wreq:停止404s抛出异常
我试图测试断开的链接,但是,当我使用Wreq的Haskell Wreq:停止404s抛出异常,haskell,Haskell,我试图测试断开的链接,但是,当我使用Wreq的get方法并运行到404时,我得到了一个异常(见下图),而不是要处理的状态码。似乎只返回了200秒 我试图遵循中的错误处理代码,但找不到返回与get u相同类型的方法。而且,在这个例子中,这似乎比我需要的更复杂 我怎样才能简单地防止异常并按原样返回responseStatus呢 verifySeatme :: Maybe URL -> IO UrlStatus verifySeatme url = do case url of
get
方法并运行到404时,我得到了一个异常(见下图),而不是要处理的状态码。似乎只返回了200秒
我试图遵循中的错误处理代码,但找不到返回与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
注意:答案已过时,请参阅其他答案。 我从未使用过
Wreq
,但看起来您应该使用getWith
传递自定义选项并配置状态处理
例如:
getWith (set checkStatus (Just $ \_ _ _ -> Nothing) defaults)
"http://google.com/hello/world"
\ \uuuuu->Nothing
是检查状态代码的功能,请参阅。它不返回任何表示任何状态代码正常的内容。这是我在研究了一点之后得到的checkStatus
函数。我不知道如何将HttpException
转换为SomeException
,但后来我找到了Control.Monad.Catch.SomeException
。这将忽略404并重新抛出所有其他异常
import Network.HTTP.Client.Types
import Network.HTTP.Types.Status
import Network.HTTP.Types.Header
import qualified Control.Exception as E
import Control.Monad.Catch (SomeException(..))
notFoundMeansNothing :: Status -> ResponseHeaders -> CookieJar -> Maybe E.SomeException
notFoundMeansNothing s h c
| s == status404 = Nothing
| otherwise =
if statusIsClientError s || statusIsServerError s then
Just . SomeException $ StatusCodeException s h c
else
Nothing
对于后代:较新版本的
wreq
(从0.5
开始)已将checkStatus
替换为checkResponse
,它采用不同的参数。与尤拉斯的答案相当的是:
getWith opts url
where opts = set checkResponse (\_ _ -> return ()) defaults
为了扩展伊芙琳·施耐德的答案,我得到了这个答案
r <- getWith opts url
where
opts = set Network.Wreq.checkResponse (Just $ \_ _ -> return ()) defaults
r返回())默认值
我没有足够的经验来理解你在这里的意思,但问题是Wreq将200
以外的任何东西都视为例外,我需要禁用它that@SimonH我添加了一个示例谢谢,也谢谢你没有使用中缀operators@Yuras我认为你应该更新或删除这个答案,这不再是正确的。我认为这是一个奇怪的设计决策,在默认情况下为非200响应设置异常。我知道有许多RESTAPI使用非200状态代码来响应结果,而不一定总是指示需要在您面前爆炸的错误。这似乎是一个不错的库,但这个决定本身让我觉得很奇怪。这是正确的答案(这里使用的是Wreq 0.5.2.1)
getWith opts url
where opts = set checkResponse (\_ _ -> return ()) defaults
r <- getWith opts url
where
opts = set Network.Wreq.checkResponse (Just $ \_ _ -> return ()) defaults