Перехват множественного исключения с помощью линз

#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 того, чтобы испортить обработку исключений.