amazonka:捕获满足特定条件的异常

时间:2015-10-28 09:47:38

标签: haskell lens

我正在使用优秀的amazonka库。

我有一个功能,我需要updateItemDynamoDB表。更新包括条件表达式。

如果更新成功,那么我的函数返回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

errorCodeErrorCode类型的构造函数。 serviceCodelens,可以将服务代码从错误中提取出来。

我还尝试使用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")

我怎样才能让这样的事情发挥作用?

1 个答案:

答案 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

Also amazonka docs