处理异常
- 异常有不同的类型,其类型会作为消息的一部分打印出来,内置的异常 列出了内置的异常以及它们的含义。
while True:
try:
x = int(raw_input("Please enter a number: "))
break
except ValueError:
print "Oops! That was no valid number. Try again..."
except (RuntimeError, TypeError, NameError):
pass
except IOError as e:
print "I/O error({0}): {1}".format(e.errno, e.strerror)
else :
pass
try
语句可能有多个异常子句,用来指定多个不同的异常。不过至多只有一个处理程序将被执行。- 如果异常的类型与 except 关键字后面的异常名不匹配,它将被传递给上层的
try
语句。 - 一个 except 子句可以用带括号的元组列出多个异常的名字。括号是必须的。
else
子句必须放在except
后面,当try
没有抛出异常时将执行该语句,当try
执行return
时else
子句将不会被执行。- 使用
else
子句比把额外的代码放在try
子句中要好,因为它可以避免意外捕获不是由try ... except
语句保护的代码所引发的异常。 except
子句可以在异常名(或元组)之后指定一个变量。这个变量将绑定于一个异常实例,同时异常的参数将存放在实例的args
中。
try:
raise Exception('spam', 'eggs')
except Exception as inst:
print type(inst) # the exception instance
print inst.args # output : spam eggs
print inst # __str__ allows args to be printed directly
引发异常
raise
语句允许程序员强行引发一个指定的异常。
try:
raise NameError('HiThere')
except NameError:
print 'An exception flew by!'
raise
自定义异常
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise MyError(2*2)
except MyError as e:
print 'My exception occurred, value:', e.value
- 用户可以通过创建新的异常类来命名自己的异常。异常通常应该继承Exception类,直接继承或者间接继承都可以。
- 创建一个能够引发几种不同错误的模块时,一个通常的做法是为该模块定义的异常创建一个基类,然后基于这个基类为不同的错误情况创建特定的子类。
finally
try
语句有另一个可选的子句,目的在于定义必须在所有情况下执行的清理操作。- 不管有没有发生异常,在离开try语句之前总是会执行
finally
子句。 - 另外,假如
try
、else
、except
、finally
语句都包含return
时,函数的返回值为最后执行的return
语句,也就是finally
中的return
语句,因为它总是最后执行。
try:
raise KeyboardInterrupt
finally:
print 'Goodbye, world!'