什么是异常
Python 用异常对象来表示异常情况。遇到错误后,会引发异常。如果异常对象并未被处理或者捕捉,程序就会用所谓的回溯(traceback,一种错误信息)终止执行。
事实上,每个异常都是一些类的实例,这些实例可以被引发,并且可以用很多种方法进行捕捉,使得程序可以捉住错误并且对其进行处理,而不是让整个程序失效。
>>> raise Exception
Traceback (most recent call last):
File "<pyshell#75>", line 1, in <module>
raise Exception
Exception
>>> raise Exception('hyperdrive overload')
Traceback (most recent call last):
File "<pyshell#76>", line 1, in <module>
raise Exception('hyperdrive overload')
Exception: hyperdrive overload
>>>
常见的一些重要的内建异常类:
NameError 在找不到名字(变量)时引发SyntaxError 在代码为错误形式时引发
TypeError 在内建操作或者函数应用于错误类型的对象时引发
ValueError 在内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时引发
ZeroDivisionError 在除法或者模除操作的第二个参数为0时引发
如何创建自己的异常类呢?就像其他类一样,只是要确保从Exception 类继承(不算是间接的或者是直接的,也就是说继承其他的内建异常类也是可以的)。那么编写一个自定义异常基本上就像下面这样:
class SomeCustomException(Exception): Pass
如果捕捉到了异常,但是又想重新引发它(也就是说要传递异常,不进行处理),那么可以调用不带参数的raise(还能在捕捉到异常时显式地提供具体异常。)
用一个块捕捉两个或者以上的异常(捕捉对象):如果要捕捉多个异常,也只需要向except 子句提供一个参数-----一个元组。
try:
x = input('Enter the first number: ')
y = input('Enter the second number: ')
print x/y
except (ZeroDivisionError, TypeError),e:
print e
为了捕捉所有Exception类的异常(也会捕捉其所有子类的异常)。
while true:
try:
x = input('Enter the first number: ')
y = input('Enter the second number: ')
print x/y
except Exception,e:
print e
print 'Please try again'
else:
break
因为使用del语句删除一个变量是非常不负责的清理手段,所以finally子句用于关闭文件或者网络套接字时会非常有用。还可以在同一条语句中组合使用try、except、finally和else(或者其中的三个)
try:
1/0
except NameError:
print "Unknow variable"
else:
print "That went well!"
finally:
print "Cleaning up"
异常处理并不是很复杂。如果知道某段代码可能会导致某种异常,而又不希望程序以堆栈跟踪的形式终止,那么就根据需要添加try/except或者try/finally语句(或者他们的组合)进行处理。
以上笔记大致来自《Python基础教程 第二版》