buggy python interpretter or am I missing something here?
Gary Herron
gary.herron at islandtraining.com
Mon Jan 27 02:03:51 EST 2014
On 01/26/2014 10:17 PM, me wrote:
> On Sun, 26 Jan 2014 21:04:57 -0800, Gary Herron wrote:
>
>> Never *ever* have a bare except like that. If it gets invoked, you have
>> no idea why. A simple typo like ixd instead of idx or a(idx) instead
>> of a[idx] would raise an exception but give you no idea why.
>>
>> Do
>> try:
>> ...
>> except Exception,e:
>> print e
>> at the absolute minimum.
>> (Python 3 syntax would differ slightly, but the advice is the same.)
>>
>> Perhaps printing a traceback along with the exception would help. Add
>> traceback.print_exc()
>
> So here's the clencher without debating the merits bare except: since a
> bare catch(...) is totally acceptable in the c++ world.
>
> When I have except: by itself the program fails...but simply adding the
> "except Exception,e: " causes the program to work correctly.
Doubtful. We've been doing this kind of stuff for decades without
hitting your supposed bug. Much more likely is that you've
misinterpreted the results. Ii don't know how, but I'm quite confident
that you have.
Your contention that the raise goes back to the sys.exit() is certainly
a mis-interpretation also. The re-raise of the original exception is
now an uncaught exception, and the interpreter's response to an uncaught
exception is to kill the program. Nearly the same result as the
sys.exit(), but via a different pathway.
>
> To me that signifies an undefined behavior of the python specification,
> or at least bad behavior of the python interpreter I'm using. If you can
> syntactically use a bare except: without generating an invalid syntax
> error then it should have a well defined and predictable outcome.
It is well defined. Slow down a bit, rerun your two tests, show is the
code *and* the results, and we'll get to the bottom of this.
>
> If in fact the "except Exception, e:" is what's required then a bare
> except shouldn't be considered valid syntax at all, right?
Bare excepts are perfectly legal valid syntax and have their uses,
however it's just extremely dangerous programming to allow a simple typo
(or any of an infinite number of possible errors) in your try section to
masquerade as a "error in command line" (to quote your print at that
point). Python's dynamic typing makes bare except extremely
dangerous. In Python, unlike C, any number of typos can be
syntactically correct, but meaningless, exception-raising actions at run
time. Things like misspelling a variable/function name, substituting a
comma for a decimal point, indexing something that is not indexable,
applying a function to the wrong parameters or wrong number of
parameters, ... All these are *not* syntax errors (as they would be in
C), but will cause a run-time exception -- and you'd never know why with
that bare except blindly catching them all and claiming "command line
error".
Gary Herron
>
> kind regards
More information about the Python-list
mailing list