From: http://www.cainiao8.com/python/basic/python_16_exception.html
为什么使用异常
错误处理、事件通知、特殊情况处理、退出时的行为、不正常的程序流程。
简单的示例
在没有任何定义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
我们可以自己触发异常,例如:
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的异常。
finally
无论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、except、else
可以在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异常、同时添加数据
raise异常的同时,我们可以添加一些额外的数据,就像下面的例子一样:
class MyException(Exception):pass try: raise MyException,", and some additional data" except MyException,data: print "MyException encoutered" print data
断言assert
断言是指期望指定的条件满足,如果不满足则抛出AssertionError异常。例如:
def positive(x): assert x > 0 print "x" positive(1) positive(0)
positive(0)一句将会抛出一个异常。
with/as
with/as语句主要是为了代替try/finally语句、通常用来做一些善后工作或者是清理现场的工作。
with open('test.txt') as myfile: for line in myfile: #code here #code here
当with代码块结束之后,文件将会自动关闭。这是因为返回的对象支持context management protocol。原书598页有关于该协议的讨论,例如如何自定义一个支持该协议、从而支持with语句的类。
From: http://www.cnblogs.com/vincent-lee/archive/2011/11/23/2259149.html
BaseException 所有异常基类
+-- SystemExit python解释器请求退出
+-- KeyboardInterrupt 用户中断执行(通常是输入ctrl+C)
+-- GeneratorExit 生成器(generator)发生异常来通知退出
+-- Exception 常规错误的基类
+-- StopIteration 迭代器没有更多的值
+-- StandardError 所有的内建标准异常的基类
| +-- BufferError
| +-- ArithmeticError 所有数值计算错误的基类
| | +-- FloatingPointError 浮点计算错误
| | +-- OverflowError 数值运算超出最大限制
| | +-- ZeroDivisionError 除(或取模)零(所有数据类型)
| +-- AssertionError 断言语句失败
| +-- AttributeError 对象没有这个属性
| +-- EnvironmentError 操作系统错误的基类
| | +-- IOError 输入输出失败
| | +-- OSError 操作系统错误
| | +-- WindowsError (Windows) windows系统调用失败
| | +-- VMSError (VMS)
| +-- EOFError 没有内建输入,到达EOF标记
| +-- ImportError 导入模块/对象 失败
| +-- LookupError 无效数据查询的基类
| | +-- IndexError 序列中没有此索引(index)
| | +-- KeyError 映射中没有这个键
| +-- MemoryError 内存溢出错误(对于Python解释器不是致命的)
| +-- NameError 未声明/初始化对象(没有属性)
| | +-- UnboundLocalError 访问未初始化的本地变量
| +-- ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
| +-- RuntimeError 一般的运行时错误
| | +-- NotImplementedError 尚未实现的方法
| +-- SyntaxError Pythony语法错误
| | +-- IndentationError 缩进错误
| | +-- TabError Tab和空格混用
| +-- SystemError 一般的解释器系统错误
| +-- TypeError 对类型无效的操作
| +-- ValueError 传入无效的参数
| +-- UnicodeError Unicode相关错误
| +-- UnicodeDecodeError Unicode解码时错误
| +-- UnicodeEncodeError Unicode编码时错误
| +-- UnicodeTranslateError Unicode转换时错误
+-- Warning 警告的基类
+-- DeprecationWarning 关于被启用的特征的警告
+-- PendingDeprecationWarning 关于构造将来语义会有改变的警告
+-- RuntimeWarning 可疑的运行时行为的警告
+-- SyntaxWarning 可疑的语言的警告 +-- UserWarning 用户代码生成警告 +-- FutureWarning +-- ImportWarning 导入模块/对象警告 +-- UnicodeWarning Unicode警告 +-- BytesWarning Bytes警告 +-- Overflow Warning 旧的关于自动提升为长整型(long)的警告