Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django using try: and except:

I was wondering if its possible to write a handling exceptions like with 2 or more except with different task to do.

I'm using Django==1.6.1 and Python 2.7

try:
    foo_instance = foo.objects.get(field_name='unknown')

except foo.DoesNotExist:
    new_rec = foo.objects.create(field_name='unknown')
    new_rec.save()

    foo_instance = foo.objects.get(field_name='unknown')

except foo.MultipleObjectsReturned:
    foo_list = foo.objects.filter(field_name='unknown')
    for record in foo_list[1:]:
       print 'Deleting foo id: ', record.id
       record.delete()

    foo_instance = foo.objects.get(field_name='unknown')
like image 944
Charlesliam Avatar asked Jun 17 '26 17:06

Charlesliam


1 Answers

You could use multiple try: except: but in your current scenario Why don't you use get_or_create ?

try: expect: contain all errors on 'Exception'. for this syntax is all

except Exception as e:

get_or_create(defaults=None, **kwargs)

A convenience method for looking up an object with the given kwargs (may be empty if your model has defaults for all fields), creating one if necessary.

Returns a tuple of (object, created), where object is the retrieved or created object and created is a boolean specifying whether a new object was created.

This reduces your above code to -

 obj, created = foo.objects.get_or_create(field_name='unknown')
 if created:
     obj.save()

I think get_or_create raises IntegrityError or MultipleObjectsReturned, to handle those simply wrap it in a try:

try:
    obj, created = foo.objects.get_or_create(field_name='unknown')
    if created:
        obj.save()
except IntegrityError: 
    #do something
except MultipleObjectsReturned:
    #do something else
except Exception as e:
    raise e
like image 129
Srikar Appalaraju Avatar answered Jun 19 '26 06:06

Srikar Appalaraju



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!