On 8/27/2013 6:02 AM, Marco Buttu wrote:
On 08/27/2013 11:22 AM, Steven D'Aprano wrote:
What matters is that when you catch "nearly everything", StopIteration is
included in the "nearly everything", but SysExit and KeyboardInterrupt
should not be. Consider:
try:
main()
except Exception as e:
print('an unexpected error occurred')
log_unhandled_exception(e)
emergency_shutdown()
sys.exit(1)
except (KeyboardInterrupt, SysExit):
# User wants to exit.
clean_exit()
sys.exit(0)
Which except clause would you expect an unhandled StopIteration to fall
under? The unexpected error clause, or the "user wants to exit cleanly"
clause?
Thanks Steven, that was clear for me. I was thinking about a design
concept: how come doesn't it inherit directly from BaseException like
GeneratorExit does? But I think I got the answer: because we can iterate
manually and so it can propagate, and so we want an except Exception
clause catches it.
Until relatively recently, in 2.5, Exception *was* the base exception
class and for nearly everything, it still is. "All built-in,
non-system-exiting exceptions are derived from this class. All
user-defined exceptions should also be derived from this class."
BaseException was added just so it would be possible to catch nearly
everything but a few exceptions. The first two were KeyboardInterrupt
and SystemExit (in 2.5). GeneratorExit was switched in 2.6, but I forget
the details of why.
--
Terry Jan Reedy
--
http://mail.python.org/mailman/listinfo/python-list