[storm] Exception handling
akira
nhytro-python at web.de
Thu Sep 20 08:37:02 BST 2007
Thanks guys, great stuff Stuart, explanation and code. Although I have
decide to check if the user exists first in the case I mentioned, I have
other places where I can use this.
Stuart Bishop wrote:
> akira wrote:
>
>> Hi all!
>>
>> I am trying to handle exceptions returned from the DB API. For example,
>> I have a UNIQUE constraint on a field, when I try to save an object that
>> violates this I get this:
>>
>> "duplicate key violates unique constraint"
>>
>> So trying to handle the errors properly so that I can return the right
>> error to the user I have done some testing:
>>
>> try:
>> store.add(user)
>> store.flush()
>> except Exception,e:
>> print e.__class__.__name__ # this emits an
>> "IntegrityError"
>> print Exception.__str__(e) # this print s"duplicate
>> key violates unique constraint "users_username_key'"
>>
>> if Exception.__str__(e) == 'duplicate key violates unique
>> constraint "users_username_key':
>>
>
> You appear to me missing a double quote here.
>
> When sniffing PostgreSQL exceptions, I always just use
> str(e).startswith(...) or similar to match just a portion of the error
> rather than the entire thing. Its still flakey in the face of localized
> PostgreSQL installs and strings being changed across PG releases, but it is
> the best we can do with psycopg1 as the driver (I vaguely recall psycopg2
> making it so we no longer need to sniff the strings).
>
> So...
>
>
> try:
> store.add(user)
> store.flush()
> except psycopg.IntegrityError, c:
> if 'violates unique constraint' in str(e):
> print "Username is already taken."
> else:
> raise
>
>
>> Why does the first "if" conditional not work? Is this the right way to
>> handle such a problem? Should I try to handle all the exceptions that
>> might crop up? I am using postgresql, can I find all the defined
>> Exceptional that I would like to handle there?
>>
>
> I doubt you want to handle *all* of them:
> http://www.postgresql.org/docs/8.2/static/errcodes-appendix.html
>
> I suspect you just want to catch all the integrity errors and return a human
> readable string. Everything else is a programming or runtime error beyond
> the user's control. This will also catch not null and foreign key
> violations, which should never get as far as the DB. It also catches check
> constraint violations, which *ideally* shouldn't (Our check constraints are
> duplicated in Python on the app side, and the app side constraints are often
> stricter than the db ones since there is less overhead in changing or
> tweaking them. The DB constraints are really only there as a safety net).
>
> I haven't looked into how to use savepoints with Storm to avoid needing to
> rollback the entire transaction if an integrity error is triggered, but it
> should be simple enough if you always ROLLBACK TO SAVEPOINT <savepoint> on
> failure and RELEASE SAVEPOINT <savepoint> on success, and only attempt a
> single command within the savepoint, to avoid confusing Storm's caches.
>
>
More information about the storm
mailing list