For a block like this:
try:
#some stuff
except Exception:
pass
pylint raises warning W0703 'Catch "Exception"'. Why?
For a block like this:
try:
#some stuff
except Exception:
pass
pylint raises warning W0703 'Catch "Exception"'. Why?
It's considered good practice to not normally catch the root Exception object, but instead to catch more specific ones - for example IOException.
Consider if an out of memory exception occurred - simply using "pass" isn't going to leave your programme in a good state.
Pretty much the only time you should catch Exception is at the top level of your programme, where you can (try to) log it, display an error, and exit as gracefully as you can.
because it thinks that you're catching too much. and it's right.
Exception are raised when something... exceptional occurs. It's generally a good thing that the program terminates.
You may want to ignore some exceptions, but IMO there's no good reason for catching a base-class like that.
Catching Exception (without re-raising) has 2 really bad side effects: errors get eaten, so you lose the stack trace, but also that ctrl-c (or whatever the break key is on your operating system) also gets handled here.
The typical behavior of programs like this is that either they can't be stopped, or that ctrl-c causes the control flow to skip forward (to the exception handler), and then continue. Then either the code can't be interrupted, or you need to hammer on ctrl-c to get it to stop.
Since Python2.6 catching Exception has become a lot more reasonable, because all the exceptions that you wouldn't want to catch (SystemExit, KeyboardInterrupt) no longer inherit from Exception. They instead inherit from a common BaseException instead. This has been done deliberately in order to make catching Exception relatively harmless, since it is such a common idiom.
See PEP 3110 for details & future plans.