错误处理、事件通知、特殊情况处理、退出时的行为、不正常的程序流程。
在没有任何定义x变量的时候:
print x
print 1
将会抛出NameError异常:
NameError: name 'x' is not defined
而且1并不会被输出,也就是说程序将被中断。如果讲代码修改如下:
try:
print x
except NameError:
print "Something is wrong!"
print 1
得到的输出将是:
Something is wrong!
1
可见,我们定义的except会“抓住”NameError类型的语句,并且执行相应的处理代码,而且程序不会被中断。
我们可以自己触发异常,例如:
raise IndexError
Python会返回:
Traceback (most recent call last):
File "d:\我的文档\桌面\todo\exep.py", line 1, in <module>
raise IndexError
IndexError
下面定义了一个MyException类,它继承自Python内置的Exception类。
class MyException(Exception):pass
try:
#some code here
raise MyException
except MyException:
print "MyException encoutered"
结果为:
MyException encoutered
可以在一个except内捕获多个异常:
except (AttributeError, TypeError, SyntaxError):
只要在except后面不加任何异常类型,这个except块就可以捕获所有的异常。
except:
当我们except Super的时候,同样会捕获到raise Sub的异常。
无论try块是否抛出异常,永远执行的代码。通常用来执行关闭文件,断开服务器连接的功能等等。
class MyException(Exception):pass
try:
#some code here
raise MyException
except MyException:
print "MyException encoutered"
finally:
print "Arrive finally"
结果:
MyException encoutered
Arrive finally
可以在try块里加入else块,代码块将在没有异常被抛出的时候执行:
try:
print "normal code here"
except MyException:
print "MyException encoutered"
else:
print "No exception"
finally:
print "Arrive finally"
结果为:
normal code here
No exception
Arrive finally
raise异常的同时,我们可以添加一些额外的数据,就像下面的例子一样:
class MyException(Exception):pass
try:
raise MyException,", and some additional data"
except MyException,data:
print "MyException encoutered"
print data
断言是指期望指定的条件满足,如果不满足则抛出AssertionError异常。例如:
def positive(x):
assert x > 0
print "x"
positive(1)
positive(0)
positive(0)一句将会抛出一个异常。
with/as语句主要是为了代替try/finally语句、通常用来做一些善后工作或者是清理现场的工作。
with open('test.txt') as myfile:
for line in myfile:
#code here
#code here
当with代码块结束之后,文件将会自动关闭。这是因为返回的对象支持context management protocol。原书598页有关于该协议的讨论,例如如何自定义一个支持该协议、从而支持with语句的类。