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

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to