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 -- http://mail.python.org/mailman/listinfo/python-list
Re: except clause not catching IndexError
Derek Schuff <[EMAIL PROTECTED]> 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. -- === <[EMAIL PROTECTED]>London, E14 http://www.andreasen.org/> <*> === -- http://mail.python.org/mailman/listinfo/python-list
Re: except clause not catching IndexError
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 -- http://mail.python.org/mailman/listinfo/python-list
Re: except clause not catching IndexError
Derek Schuff wrote: > I have some code like this: > 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 [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list
Re: except clause not catching IndexError
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 -- http://mail.python.org/mailman/listinfo/python-list
Re: except clause not catching IndexError
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 "", 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. -- http://mail.python.org/mailman/listinfo/python-list
Re: except clause not catching IndexError
Steven D'Aprano <[EMAIL PROTECTED]> 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) Sometimes, it is the parens: >>> b = () >>> type (b) 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. -- http://mail.python.org/mailman/listinfo/python-list
Re: except clause not catching IndexError
Steven D'Aprano <[EMAIL PROTECTED]> 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 -- [EMAIL PROTECTED] -- 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 -- http://mail.python.org/mailman/listinfo/python-list