我正在使用优秀的amazonka
库。
我有一个功能,我需要updateItem
到DynamoDB
表。更新包括条件表达式。
如果更新成功,那么我的函数返回True
(在应用程序monad中)。如果更新引发ServiceError
ErrorCode
等于ConditionalCheckFailed
,则我的函数返回False
。所有其他异常都由函数调用者捕获。
换句话说,我希望函数在成功更新表True
时返回False
,否则我想抛出除上述异常之外的所有异常。
我的问题是我不知道如何检查是否抛出了ServiceError
以上ErrorCode
。
这是我尝试过的(try
来自Control.Monad.Catch
并返回m (Either e a)
,第一列中括号内的数字对应于下面错误中的行号):
[41] rs <- try $ send $ updateItem "TableName" & uiKey ...blah blah
case rs of
[47] Left e -> if (serviceCode e) == (errorCode "ConditionalCheckFailed")
then return False else throwM e
Right _ -> return True
errorCode
是ErrorCode
类型的构造函数。 serviceCode
是lens
,可以将服务代码从错误中提取出来。
我还尝试使用tryJust
:
rs <- try' $ send $ updateItem "TableName" & uiKey ...blah blah
where try' = tryJust (\e -> if (serviceCode e) == (errorCode "ConditionalCheckFailed") then Nothing else Just e)
在这两种情况下,我似乎无法让谓词if (serviceCode e) == (errorCode "ConditionalCheckFailed")
进行类型检查(我不太了解镜头):
Couldn't match expected type ‘ServiceError -> f1 ServiceError’
with actual type ‘ErrorCode’
Relevant bindings include
e :: ErrorCode -> f1 ErrorCode
(bound at src/Foo.hs:47:10)
rs :: Either (ErrorCode -> f1 ErrorCode) UpdateItemResponse
(bound at src/Foo.hs:41:3)
Possible cause: ‘errorCode’ is applied to too many arguments
In the second argument of ‘(==)’, namely
‘(errorCode "ConditionalCheckFailed")’
In the expression:
(serviceCode e) == (errorCode "ConditionalCheckFailed")
我怎样才能让这样的事情发挥作用?
答案 0 :(得分:1)
您需要使用one of lens' exception handling function以及amazonka
中预定义的lens exception。
有点像:
handling _ConditionalCheckFailedException ({- your handling code goes here -}) $
do send $ updateItem "TableName" & uiKey ...blah blah