问题描述
我正在将Lens
与Amazonka
一起使用来处理错误,但是我很难处理错误:
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
,它搞砸了异常处理。