Python 用异常对象来表示异常情况。如果异常对象并未被处理或捕获,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行。实际上每个异常都是一些类的实例,这些类可以被引发,并且可以用很多方法进行捕获,使得程序可以进一步对错误进行处理。
使用raise语句引发异常:
为了引发异常,可以使用一个类(Exception的子类)或者实例参数调用raise语句,程序会自动创建实例。以下语句可以列出所有内建的异常类:
>>>import exceptions
>>>dir(exceptions)
自定义异常类:
可以根据异常所在的类,选择性地处理当前类型的异常,需要一个独立于exceptions模块的异常类。
创建自己的异常类就像其他类一样——只需确保从Exception类继承(间接或直接皆可),大致类似以下语句:
class SomeCustomException(Exception): pass
可以通过使用 try / except 语句来捕获异常。例如:
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
print x/y
except ZeroDivisionError:
print "The second number can't be zero!"
若没有进行捕获,异常将“传播”到调用的函数中,并且“浮”到程序的最顶层。
如果在某个地方捕获到了一个异常,可以继续用无参数的raise语句抛出,即在当前仍然不予以处理。
可以直接在同一个 try / except 语句后面加上另一个except 子句:
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
print x/y
except ZeroDivisionError:
print "The second number can't be zero!"
except TypeError:
print "That wasn't a numebr!"
类似的,也可以用一个块来捕捉两个异常,将它们作为元组在 except 语句后面列出,注意括号一定不能少:
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
print x/y
except (ZeroDivisionError, TypeError, NameError):
print 'Your numebrs were bogus!'
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
print x/y
except (ZeroDivisionError, TypeError, NameError), e:
print e
全能捕获:如果想用一段代码捕捉所有异常,可以在except子句中忽略所有的异常类:
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
print x/y
except:
print 'Something wrong happened!'
一个很有用的特性:在 try / except 语句后再附上 else 语句块,则若发生了异常则不执行else子句,而异常没有发生的时候则执行else中的子句,如例子:
while True:
try:
x=input('Enter the first number: ')
y=input('Enter the second number: ')
value=x/y
print 'x/y is ', value
except:
print 'Invalid input. Please try again.'
else:
break
这里的循环只有在没有异常发生的情况下才会退出,只要有错误发生,就会不断要求重新输入。
最后还可以接 finally 子句。它可以用来在可能的异常后进行清理。finally 子句不管 try 子句中是否发生异常都一定会被执行,作用域功能与 java 异常中的 finally 语句类似,但是一个重要的不同是:在Python中的 try 语句中不能同时使用 except 和 finally 子句——但是可以一个子句放置在另一个子句中。
异常与函数可以一起使用,如果异常在函数内引发而不被处理,它就会传播至函数调用的地方,如果在那里也没有被处理,则一直到达主程序(全局作用域),如果仍没有被处理,则引发程序崩溃,打印出堆栈跟踪信息。