使用镜头捕捉多个异常

问题描述

我正在将LensAmazonka一起使用来处理错误,但是我很难处理错误

doSignup e p = (AWS.send $ AWS.signUp "secret" e p)
    $> Right ()
    & catching_ AWS._UsernameExistsException (return $ Left AlreadyExistingEmail)
    & catching_ AWS._InvalidPasswordException (return $ Left WeakPassword)
    & catching  AWS._SertviceError (return . UnkNownSignUpError)

data SignUpError where
  AlreadyExistingEmail ::                          SignUpError
  NotAnEmail           ::                          SignUpError
  WeakPassword         ::                          SignUpError
  UnkNownSignUpError   :: forall a. Show a => a -> SignUpError

我很难保持一致的捕捉行为,当抛出_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镜头,不是这种情况。

我该如何使用“类似模式匹配”的方式来处理异常?预先感谢。

解决方法

实际上使用的是Control.Lens.catching而不是Network.AWS.Prelude.catching,它搞砸了异常处理。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...