On Wed, 24 Sep 2008 10:54:40 -0500, Grant Edwards wrote: > You're right. I had forgotten that sys.exit() is actually raising the > system exit exception, and that the application calling the library > could handle that exception.
Could but shouldn't. The exception hierarchy was re-designed in Python 2.5 specifically so that SystemExit and KeyboardInterrupt no longer inherit from Exception. That means this will do the right thing: try: process(record) if changed: update(record) except Exception: # don't write the record if any error occurs pass Neither SystemExit nor KeyboardInterrupt are errors, and they should not be treated as errors. I quote from the Fine Manual: [SystemExit] inherits from BaseException instead of StandardError or Exception so that it is not accidentally caught by code that catches Exception. This allows the exception to properly propagate up and cause the interpreter to exit. http://docs.python.org/lib/module-exceptions.html SystemExit is not an error. KeyboardInterrupt is not an error. Libraries should not use SystemExit to signal an error any more than they should use MemoryError to signal a missing attribute. Whether or not an application exits is up to the application to decide, not the library it wraps. Libraries should report errors by raising an Exception (note the capital E), and the application should decide whether or not it is recoverable, and if not, exit (perhaps by simply not catching the exception). -- Steven -- http://mail.python.org/mailman/listinfo/python-list