PynamoDB icon indicating copy to clipboard operation
PynamoDB copied to clipboard

why can't we catch/suppress ConditionalCheckFailedException?

Open koreno opened this issue 2 years ago • 3 comments

It seems quite unpythonic to force users to write such constructs when dealing with the oh-so-useful conditional operations in DynamoDM:

try:
    thread_item.save(Thread.forum_name.exists())
except PutError as e:
    if isinstance(e.cause, ClientError):
        code = e.cause.response['Error'].get('Code')
        print(code == "ConditionalCheckFailedException")

PynamoDB already issues it own exceptions - why not perform this if and raise a ConditionalCheckFailed? why perpetuate the bad API for boto3 (in this regard) into this otherwise very pythonic library?

Make this work:

try:
    thread_item.save(Thread.forum_name.exists())
except ConditionalCheckFailed:
    pass

koreno avatar Sep 24 '22 21:09 koreno

The only counter-point I can offer is that, unless we break backward compatibility, we'd need to have:

  • UpdateConditionalCheckFailedError extending UpdateError
  • PutConditionalCheckFailedError extending PutError
  • DeleteConditionalCheckFailedError extending DeleteError

BTW, to make it a bit shorter right now, you can opt to use the PynamoDBException.cause_response_code property.

ikonst avatar Sep 26 '22 15:09 ikonst

What do you say? can this be implemented? I'm still suprised that this is the way to handle something that is so common... Isn't this supposed to be the value of a pythonic, OO wrapper code to DynamoDB?

koreno avatar Oct 25 '23 18:10 koreno

I've submitted this PR - https://github.com/pynamodb/PynamoDB/pull/1202 Would you like to consider it? is there something I should do in order to contribute code properly?

koreno avatar Dec 05 '23 22:12 koreno