exceptions and items in a list

R

rbt

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
 
A

Andrey Tatarinov

rbt said:
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?

# skip bad object and continue with others
for object in objects:
try:
#do something to object
except Exception:
pass

# stop at first bad object
try:
for object in objects:
#do something to object
except Exception:
pass
 
V

vincent wehren

rbt said:
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...
 
R

rbt

Andrey said:
# skip bad object and continue with others
for object in objects:
try:
#do something to object
except Exception:
pass

# stop at first bad object
try:
for object in objects:
#do something to object
except Exception:
pass

Thanks Andrey. That's a great example of how to do it.
 
P

Peter Hansen

rbt said:
Thanks Andrey. That's a great example of how to do it.

Actually, it's not really a "great" example, since it catches
_all_ exceptions that might happen, and quietly ignores
them. For example, in the following code, you might not
realize that you've made a typo and none of the items in
the list are actually being checked, even though there is
obviously no problem with any of these simple items
(integers from 0 to 9).

def fornat_value(val):
return '-- %5d --' % val

L = range(10)
for val in L:
try:
print format_value(val)
except Exception:
pass

It's almost always better to identify the *specific*
exceptions which you are expecting and to catch those,
or not do a simple "pass". See Vincent's response,
for example, where he explicitly asks only for ValueErrors
and lets others propagate upwards, to be reported.

(I realize these were contrived examples, but examples
that don't mention this important issue risk the propagation
of buggy code...)

-Peter
 
S

Steve Holden

vincent said:
rbt said:
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...

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.
... 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".

regards
Steve
 
V

vincent wehren

Steve said:
vincent said:
rbt said:
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...


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.
... 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.
.... 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,
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top