exceptions and items in a list

vincent wehren vincent at visualtrans.de
Tue Jan 11 01:02:54 EST 2005


Steve Holden wrote:
> vincent wehren wrote:
> 
>> rbt wrote:
>>
>>> If I have a Python list that I'm iterating over and one of the 
>>> objects in the list raises an exception and I have code like this:
>>>
>>> try:
>>>     do something to object in list
>>> except Exception:
>>>     pass
>>>
>>> Does the code just skip the bad object and continue with the other 
>>> objects in the list, or does it stop?
>>>
>>> Thanks
>>
>>
>>
>> Fire up a shell and try:
>>
>>  >>> seq = ["1", "2", "a", "4", "5", 6.0]
>>  >>> for elem in seq:
>> ....     try:
>> ....        print int(elem)
>> ....     except ValueError:
>> ....        pass
>>
>>
>> and see what happens...
>>
>> -- 
>> Vincent Wehren
> 
> 
> I suspect the more recent versions of Python allow a much more elegant 
> solution. I can't remember precisely when we were allowed to use 
> continue in an except suite, but I know we couldn't in Python 2.1.
> 
> Nowadays you can write:
> 
> Python 2.4 (#1, Dec  4 2004, 20:10:33)
> [GCC 3.3.3 (cygwin special)] on cygwin
> Type "help", "copyright", "credits" or "license" for more information.
>  >>> for i in [1, 2, 3]:
>  ...   try:
>  ...     print i
>  ...     if i == 2: raise AttributeError, "Bugger!"
>  ...   except AttributeError:
>  ...     print "Caught exception"
>  ...     continue
>  ...
> 1
> 2
> Caught exception
> 3
>  >>>
> 
> To terminate the loop on the exception you would use "break" instead of 
> "continue".

What do you mean by a more elegant solution to the problem? I thought 
the question was if a well-handled exception would allow the iteration 
to continue with the next object or that it would stop. Why would you 
want to use the continue statement when in the above case that is 
obviously unnecessary?:

$ python
Python 2.4 (#1, Dec  4 2004, 20:10:33)
[GCC 3.3.3 (cygwin special)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
 >>> for i in [1,2,3]:
...     try:
...         if i == 2: raise AttributeError, "Darn!"
...     except AttributeError:
...         print "Caught Exception"
...
1
2
Caught Exception
3
 >>>

Or do you mean that using "continue" is more elegant than using "pass" 
if there are no other statements in the except block?


Regards,
--
Vincent Wehren
> 
> regards
>  Steve



More information about the Python-list mailing list