try/except in a loop

Peter Otten __peter__ at web.de
Thu May 3 09:57:32 EDT 2012


Jean-Michel Pichavant wrote:

> Chris Kaynor wrote:
>> On Wed, May 2, 2012 at 12:51 PM, J. Mwebaze <jmwebaze at gmail.com> wrote:
>>   
>>> I have multiple objects, where any of them can serve my purpose..
>>> However some objects might not have some dependencies. I can not tell
>>> before hand if the all the dependencies exsit. What i want to is begin
>>> processing from the 1st object, if no exception is raised, i am done..
>>> if an exception is
>>> raised, the next object is tried, etc  Something like
>>>
>>> objs = [... ]
>>> try:
>>>   obj = objs[0]
>>>   obj.make()
>>> except Exception, e:
>>>   try:
>>>       obj = objs[1]
>>>       obj.make()
>>>   except Exception, e:
>>>      try:
>>>         obj = objs[2]
>>>         obj.make()
>>>      except Exception, e:
>>>        continue
>>>
>>> The problem is the length of the list of objs is variable... How can i
>>> do this?
>>>     
>>
>>
>> for obj in objs:
>>     try:
>>         obj.make()
>>     except Exception:
>>         continue
>>     else:
>>         break
>> else:
>>     raise RuntimeError('No object worked')
>>
>>   
> For the record, an alternative solution without try block:

Hmm, it's not sufficient that the method exists, it should succeed, too.

class Obj:
    def make(self):
        raise Exception("I'm afraid I can't do that")
objs = [Obj()]

> candidates = [obj for obj in objs if hasattr(obj, 'make') and
> callable(obj.make)]
> if candidates:
>     candidates[0].make()

It is often a matter of taste, but I tend to prefer EAFP over LBYL.




More information about the Python-list mailing list