异常

类似Java中的Exception。Python用异常对象来表示异常情况。

如何抛出异常

Python中的raise语句。

>>> raise Exception
Traceback (most recent call last):
File "<stdin>", line 1, in <module>

Python中Exception是所有异常的基类

自定义异常类

很简单,从Exception类中继承就可以了:

>>> class MyException(Exception):
... pass
...
>>> raise MyException
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.MyException

捕获异常

通过try/except语句来实现。

>>> try:
... x = 1
... y = 0
... print x/y
... except ZeroDivisionError:
... print "The sceond number cant be zero!"
...

如果捕捉到了异常,又想传递这个异常,可以这样:

>>> try:
... x = 1
... y = 0
... print x/y
... except ZeroDivisionError:
... raise
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
ZeroDivisionError: integer division or

不止一个except语句

如果上面的例子中的y不是数字0,而是一个字符串。那么就会产生另外一个异常,为了捕获这个异常,需要加上另一个except子句

>>> try:
... x = 1
... y = 0
... print x/y
... except ZeroDivisionError:
... raise
... except TypeError:
... print "Thas wasnt a number"

如果需要在一个except子句中捕获多个类型异常,那么可以将它们作为元组列出。

捕获对象

下面介绍如何获得异常参数e:

>>> try:
... x = 1
... y = 0
... print x/y
... except (ZeroDivisionError,TypeError),e:
... print e
...
integer division or

Python3.0中,except子句被写作为except(ZeroDivisionError,TypeError) as e

全捕获

如果想用一段代码捕获所有异常,那么在except子句中忽略所有的异常类即可:

>>> try:
... x = 1
... y = 0
... print x/y
... except:
... print "Something bad happened..."

但是这种做法不推荐,因为无法获知引发异常的原因,用​​except Exception, e​​会更好些

还可以给try/except语句加个else子句:

>>> try:
... x = 1
... y = 0
... print x/y
... except (ZeroDivisionError,TypeError),e:
... print e
... else:
... print 'It went as planned.'

没有异常发生时会执行else中的语句。

finally子句

try:
x = 1/0
finally:
print 'Cleaning up...'
del x

finally子句肯定会执行,不管有没有异常。