#amazon-web-services #haskell #exception #haskell-lens
#amazon-веб-сервисы #haskell #исключение #haskell-lens
Вопрос:
Я использую Lens
with Amazonka
для устранения ошибок, но мне трудно справиться с ошибками:
doSignup e p = (AWS.send $ AWS.signUp "secret" e p)
$> Right ()
amp; catching_ AWS._UsernameExistsException (return $ Left AlreadyExistingEmail)
amp; catching_ AWS._InvalidPasswordException (return $ Left WeakPassword)
amp; catching AWS._SertviceError (return . UnknownSignUpError)
data SignUpError where
AlreadyExistingEmail :: SignUpError
NotAnEmail :: SignUpError
WeakPassword :: SignUpError
UnknownSignUpError :: forall a. Show a => a -> SignUpError
Я изо всех сил пытаюсь обеспечить последовательное поведение при перехвате, когда a _UsernameExistsException
выдается, я получаю Left WeakPassword
.
Это становится еще более странным, потому что это работает, когда я пропускаю WeakPassword
строку.
Пока я получаю правильную ошибку (сохраняя только последнюю строку):
expected: Right ()
but got: Left UnknownSignUpError ServiceError' {_serviceAbbrev = Abbrev "CognitoIdentityProvider", _serviceStatus = Status {statusCode = 400, statusMessage = "Bad Request"}, _serviceHeaders = [("Date","Tue, 06 Oct 2020 05:38:56 GMT"),("Content-Type","application/x-amz-json-1.1"),("Content-Length","96"),("Connection","keep-alive"),("x-amzn-RequestId","b09210a3-41ed-46ee-af4f-46db58b98695"),("x-amzn-ErrorType","UsernameExistsException:"),("x-amzn-ErrorMessage","An account with the given email already exists.")], _serviceCode = ErrorCode "UsernameExists", _serviceMessage = Just (ErrorMessage "An account with the given email already exists."), _serviceRequestId = Just (RequestId "b09210a3-41ed-46ee-af4f-46db58b98695")}
Я пытался использовать catches
, но handler
требует Typeable
линз, что не так.
Как я могу использовать «похожий на шаблон» способ обработки исключений? Заранее спасибо.
Комментарии:
1. Это кажется очень удивительным. Можете ли вы показать код, который генерирует исключение? Возможно, вы получаете не то исключение, о котором думаете.
Ответ №1:
Фактически Control.Lens.catching
использовался вместо Network.AWS.Prelude.catching
того, чтобы испортить обработку исключений.