Ich mache einige http Anrufe mit wreq
und möchte irgendeine Ausnahme fangen und einen Either
Typ zurückgeben. Ich habe so etwas versucht, aber ich konnte nicht herausfinden, wie man die Anrufe manipuliert, damit es check eingibt.`wreq` Get/Post mit Ausnahmebehandlung
-- exhaustive pattern match omitted here
safeGetUrl :: URL -> Maybe Login -> Maybe Password -> IO (Either String (Response LBS.ByteString))
safeGetUrl url (Just login) (Just pass) = do
let def = defaults
opts = def & auth ?~ basicAuth (BS.pack login) (BS.pack pass)
r <- getWith opts url `E.catch` handler
return $ Right r
where
handler :: HttpException -> Either String (Response LBS.ByteString)
handler (StatusCodeException s _ _) = do
return $ Left $ LBS.unpack (s ^. statusMessage)
Ich bin den Typ Fehler unten einfügen, aber ich weiß, der obige Code wird nicht kompilieren. Das Problem ist r <- getWith opts url
E.catch
handler
. Der erste Teil gibt IO (Res...
zurück, aber der Ausnahmebehandler gibt Either..
zurück. Ich versuchte, die getWith..
in Either
anhebend, aber das prüfte auch nicht.
Couldn't match type ‘Either String (Response LBS.ByteString)’
with ‘IO (Response LBS.ByteString)’
Expected type: HttpException -> IO (Response LBS.ByteString)
Actual type: HttpException
-> Either String (Response LBS.ByteString)
In the second argument of ‘catch’, namely ‘handler’
In a stmt of a 'do' block: r <- getWith opts url `catch` handler
Gibt es eine Möglichkeit, diese Ausnahme zu fangen und zurück einen IO Either
Typen?
Danke. Ich habe versucht, 'getWith' zu heben und irgendwie konnte ich nicht herausfinden, wie es geht. Ich bin immer noch im Anfängerstadium in Haskell, also habe ich nicht sofort gesehen, wie ich einfach '<$>' verwenden kann, um die Antwort in "Entweder" zu verpacken. In Bezug auf die "BSC" vs. "LBS" ... war das ein Versehen meinerseits - danke, dass du es aufgezeigt hast. – Ecognium