It is possible to write programs that handle selected exceptions. Look at the following example, which prints a table of inverses of some floating point numbers:
>>> numbers = [0.3333, 2.5, 0, 10] >>> for x in numbers: ... print x, ... try: ... print 1.0 / x ... except ZeroDivisionError: ... print '*** has no inverse ***' ... 0.3333 3.00030003 2.5 0.4 0 *** has no inverse *** 10 0.1 >>>The
try
statement works as follows.
try
and except
keywords) is
executed.try
statement is finished.except
keyword,
the rest of the try clause is skipped, the except clause is executed,
and then execution continues after the try
statement.try
statement may have more than one except clause, to specify
handlers for different exceptions.
At most one handler will be executed.
Handlers only handle exceptions that occur in the corresponding try
clause, not in other handlers of the same try
statement.
An except clause may name multiple exceptions as a parenthesized list,
e.g.:
... except (RuntimeError, TypeError, NameError): ... passThe last except clause may omit the exception name(s), to serve as a wildcard. Use this with extreme caution, since it is easy to mask a real programming error in this way!
The try...except
statement has an optional else
clause,
which must follow all except
clauses. It is useful to place
code that must be executed if the try
clause does not raise an
exception. For example:
for arg in sys.argv: try: f = open(arg, 'r') except IOError: print 'cannot open', arg else: print arg, 'has', len(f.readlines()), 'lines' f.close()
When an exception occurs, it may have an associated value, also known as the exceptions's argument. The presence and type of the argument depend on the exception type. For exception types which have an argument, the except clause may specify a variable after the exception name (or list) to receive the argument's value, as follows:
>>> try: ... spam() ... except NameError, x: ... print 'name', x, 'undefined' ... name spam undefined >>>If an exception has an argument, it is printed as the last part (`detail') of the message for unhandled exceptions.
Exception handlers don't just handle exceptions if they occur immediately in the try clause, but also if they occur inside functions that are called (even indirectly) in the try clause. For example:
>>> def this_fails(): ... x = 1/0 ... >>> try: ... this_fails() ... except ZeroDivisionError, detail: ... print 'Handling run-time error:', detail ... Handling run-time error: integer division or modulo >>>
guido@CNRI.Reston.Va.US