Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Wreq:停止404s抛出异常_Haskell - Fatal编程技术网

Haskell Wreq:停止404s抛出异常

Haskell Wreq:停止404s抛出异常,haskell,Haskell,我试图测试断开的链接,但是,当我使用Wreq的get方法并运行到404时,我得到了一个异常(见下图),而不是要处理的状态码。似乎只返回了200秒 我试图遵循中的错误处理代码,但找不到返回与get u相同类型的方法。而且,在这个例子中,这似乎比我需要的更复杂 我怎样才能简单地防止异常并按原样返回responseStatus呢 verifySeatme :: Maybe URL -> IO UrlStatus verifySeatme url = do case url of

我试图测试断开的链接,但是,当我使用Wreq的
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