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
