Python中的异常

101 阅读2分钟

异常

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

如何抛出异常

Python中的raise语句。

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

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!"
... 
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 modulo by zero

不止一个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 modulo by zero

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子句肯定会执行,不管有没有异常。