By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,818 Members | 1,282 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,818 IT Pros & Developers. It's quick & easy.

exceptions and items in a list

P: n/a
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
Jul 18 '05 #1
Share this Question
Share on Google+
6 Replies


P: n/a
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?


# 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
Jul 18 '05 #2

P: n/a
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
Jul 18 '05 #3

P: n/a
rbt
Andrey Tatarinov 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?

# 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.
Jul 18 '05 #4

P: n/a
rbt wrote:
Andrey Tatarinov wrote:
# skip bad object and continue with others
for object in objects:
try:
#do something to object
except Exception:
pass


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
Jul 18 '05 #5

P: n/a
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".

regards
Steve
--
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/
Holden Web LLC +1 703 861 4237 +1 800 494 3119
Jul 18 '05 #6

P: n/a
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

Jul 18 '05 #7

This discussion thread is closed

Replies have been disabled for this discussion.