Я пытаюсь проверить неработающие ссылки, но когда я использую метод Wreq get
и запускаю в 404, я получаю исключение (см. Ниже), а не код состояния для обработки. Кажется, возвращено только 200 человек.Wreq: исключение исключения для исключения 404s
Я попытался выполнить код обработки ошибок в tutorial, но я не могу найти способ возврата того же типа, что и 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 [email protected](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"),....
Юрась предложил используя параметры, но я не смог работать с примером, используя 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
Я не достаточно опытен, чтобы получить все, что вы имеете в виду здесь, но проблема в том, что Wreq обрабатывает что-либо другое, чем '200' как исключение, и мне нужно отключить это. –
@SimonH. Я добавил пример – Yuras
. Спасибо, а также за то, что вы не используете операторы infix –