473,403 Members | 2,222 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,403 software developers and data experts.

except clause not catching IndexError

I'm sorry if this is a FAQ or on an easily-accesible "RTFM" style page, but
i couldnt find it.

I have some code like this:
for line in f:
toks = line.split()
try:
if int(toks[2],16) == qaddrs[i]+0x1000 and toks[0] == "200": #producer
write
prod = int(toks[3], 16)
elif int(toks[2],16) == qaddrs[i]+0x1002 and toks[0] == "200":
#consumer write
cons = int(toks[3], 16)
else:
continue
except IndexError: #happens if theres a partial line at the end of file
print "indexerror"
break

However, when I run it, it seems that I'm not catching the IndexError:
Traceback (most recent call last):
File "/home/dschuff/bin/speeds.py", line 202, in ?
if int(toks[2],16) == qaddrs[i]+0x1000 and toks[0] == "200": #producer
write
IndexError: list index out of range

If i change the except IndexError to except Exception, it will catch it (but
i believe it's still an IndexError).
this is python 2.3 on Debian sarge.

any ideas?

thanks,
-derek
Feb 22 '06 #1
7 6362
Derek Schuff <ds*****@purdue.edu> writes:
I have some code like this:
[...]
except IndexError: #happens if theres a partial line at the end of file
print "indexerror"
break

However, when I run it, it seems that I'm not catching the IndexError:
Traceback (most recent call last):
File "/home/dschuff/bin/speeds.py", line 202, in ?
if int(toks[2],16) == qaddrs[i]+0x1000 and toks[0] == "200": #producer
write
IndexError: list index out of range


Did you by any chance do something like:

except ValueError, IndexError:

at some point earlier in this function? That, when catching ValueError
assigns the resulting exception to IndexError (and so the following
except IndexError: wouldn't work as IndexError is no longer what you
think it is). The correct syntax for catching multiple exceptions is:

except (ValueError, IndexError), targetVariable:

You could verify this by doing a print repr(IndexError) before your
line 202, to see that it really is the IndexError builtin.

--
================================================== =============
<er**********@andreasen.org> London, E14
<URL:http://www.andreasen.org/> <*>
================================================== =============

Feb 22 '06 #2
Derek Schuff wrote:
I have some code like this:
for line in f:
toks = line.split()
try:
if int(toks[2],16) == qaddrs[i]+0x1000 and toks[0] == "200": #producer
write
prod = int(toks[3], 16)
elif int(toks[2],16) == qaddrs[i]+0x1002 and toks[0] == "200":
#consumer write
cons = int(toks[3], 16)
else:
continue
except IndexError: #happens if theres a partial line at the end of file
print "indexerror"
break

However, when I run it, it seems that I'm not catching the IndexError:
Traceback (most recent call last):
File "/home/dschuff/bin/speeds.py", line 202, in ?
if int(toks[2],16) == qaddrs[i]+0x1000 and toks[0] == "200": #producer
write
IndexError: list index out of range

If i change the except IndexError to except Exception, it will catch it (but
i believe it's still an IndexError).
this is python 2.3 on Debian sarge.

any ideas?

Sounds like IndexError has been redefined somewhere, e.g.:
IndexError = 'something entirely different'
foo = []
try:
foo[42]
except IndexError: # will not catch the real IndexError; we're
shadowing it
pass

Try adding "print IndexError" right before your trouble spot, and see
if it outputs "exceptions.IndexError".

--Ben

Feb 22 '06 #3
Derek Schuff wrote:
I have some code like this: <code nobody else can run>
However, when I run it, it seems that I'm not catching the IndexError:
Traceback (most recent call last):
File "/home/dschuff/bin/speeds.py", line 202, in ?
if int(toks[2],16) == qaddrs[i]+0x1000 and toks[0] == "200": #producer
write
IndexError: list index out of range
This was good, the actual error; I suspect you overwrote IndexError.
The general principal is to boil down your code to the smallest code
that exhibits the problem. This is not just to aid us, since usually
at some point you delete a block of lines and the problem goes
magically away.
If i change the except IndexError to except Exception, it will catch it (but
i believe it's still an IndexError). This is python 2.3 on Debian sarge. More points for identifying Python version and OS.
any ideas?

As above, but to test my theory:

....
except Exception, e:
print 'caught %r: %r (IndexError is %r)' % (
e, e.__class__, IndexError)

--Scott David Daniels
sc***********@acm.org
Feb 22 '06 #4
Erwin S. Andreasen wrote:
Did you by any chance do something like:

except ValueError, IndexError:

at some point earlier in this function? That, when catching ValueError
assigns the resulting exception to IndexError (and so the following
except IndexError: wouldn't work as IndexError is no longer what you
think it is). The correct syntax for catching multiple exceptions is:

except (ValueError, IndexError), targetVariable:

You could verify this by doing a print repr(IndexError) before your
line 202, to see that it really is the IndexError builtin.


hey, nice catch. In fact I did exactly that. in my search for a solution for
this problem i discovered the catch-a-tuple-of-exceptions error, and in
fact fixed it, but didn't realize that it was related to the one I posted.
(the idea that exceptions can be redefined caught me off guard).

thanks (to both of you who responded),
-derek
Feb 22 '06 #5
Erwin S. Andreasen wrote:
Did you by any chance do something like:

except ValueError, IndexError:

at some point earlier in this function? That, when catching ValueError
assigns the resulting exception to IndexError (and so the following
except IndexError: wouldn't work as IndexError is no longer what you
think it is). The correct syntax for catching multiple exceptions is:

except (ValueError, IndexError), targetVariable:

You mean to say that "except X,Y:" gives different
results to "except (X,Y):"?

That can't be good.
try: .... L = []; print L[2]
.... except ValueError, IndexError:
.... print "Error!"
....
Traceback (most recent call last):
File "<stdin>", line 3, in ?
IndexError: list index out of range
try:

.... L = []; print L[2]
.... except (ValueError, IndexError):
.... print "Error!"
....
Error!
And here I was thinking that commas make tuples, not
brackets. What is happening here?
--
Steven.

Feb 23 '06 #6
Steven D'Aprano <st***@REMOVEMEcyber.com.au> wrote:
And here I was thinking that commas make tuples, not
brackets. What is happening here?


What is happening is that the syntax for forming tuples is one of Python's
warts. Sometimes the comma is what makes a tuple:
a = 1, 2
type (a) <type 'tuple'>

Sometimes, it is the parens:
b = ()
type (b)

<type 'tuple'>

Sometimes the syntax is ambiguous and you need both. This happens anytime
you have a list of comma separated things, such as in the arguments to a
function:

a = foo (1, 2) # two integer arguments
b = foo ((a, 2)) # one tuple argument

The except clause of a try statement is one of those times.
Feb 23 '06 #7
Steven D'Aprano <st***@REMOVEMEcyber.com.au> wrote:
You mean to say that "except X,Y:" gives different
results to "except (X,Y):"?
[ ... ]
And here I was thinking that commas make tuples, not
brackets. What is happening here?


Similar kind of thing to what's happening here:
print "Hello,", "world!" Hello, world! print ("Hello", "world!")

('Hello', 'world!')

And for that matter foo(a, b) v. foo((a, b)). Commas make
tuples, but they're also argument separators, and if you're
using a tuple as an argument you need the brackets to
indicate precedence.

--
\S -- si***@chiark.greenend.org.uk -- http://www.chaos.org.uk/~sion/
___ | "Frankly I have no feelings towards penguins one way or the other"
\X/ | -- Arthur C. Clarke
her nu becomež se bera eadward ofdun hlęddre heafdes bęce bump bump bump
Feb 23 '06 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

39
by: Erlend Fuglum | last post by:
Hi everyone, I'm having some trouble sorting lists. I suspect this might have something to do with locale settings and/or character encoding/unicode. Consider the following example, text...
0
by: John J. Lee | last post by:
Bare "except:", with no exception specified, is nasty because it can easily hide bugs. There is a case where it seemed useful to me in the past. Now it seems like a bad idea to me (but I think...
20
by: John Salerno | last post by:
I'm starting out with this: try: if int(text) 0: return True else: self.error_message() return False except ValueError: self.error_message()
35
by: Arnaud Delobelle | last post by:
Hi all, Imagine I have three functions a(x), b(x), c(x) that each return something or raise an exception. Imagine I want to define a function that returns a(x) if possible, otherwise b(x),...
2
by: AWasilenko | last post by:
I can't figure out this problem Im having, I just can't understand why it is ignoring the call I put in. First the code (This is a cherrypy website): import sys, cherrypy, html class Root:...
5
by: Nebur | last post by:
I'm using the contract.py library, running Python 2.4.4. Now I'm confronted with the following exception backtrace: (...) File "/usr/lib/python2.4/site-packages/contract.py", line 1265, in...
9
by: ssecorp | last post by:
Is this correct use of exceptions? to raise an indexerror and add my own string insetad of just letting it raise a IndexError by itself and "blaming" it on list.pop? class Stack(object): def...
11
by: cnb | last post by:
If I get zero division error it is obv a poor solution to do try and except since it can be solved with an if-clause. However if a program runs out of memory I should just let it crash right?...
9
by: ssecorp | last post by:
or why does this take so god damn long time? and if I run into an IndexError it break out of the inner loop right? so having range up to 10000000 or 1000 wouldn't matter if biggest working x is...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.