一、python异常定义
Python用异常对象(exception object)来表示异常情况,在遇到异常之后,如果异常对象没有进行处理或者捕捉,程序就会用回溯(traceback,一种错误信息)来终止程序继续执行。python中每个异常都是异常类的实例(文末会列出python常见的异常类实例),这些实例可以被引发并有多种方法进行捕捉,使得程序能够捕捉到错误并对其进行处理,以让程序继续正确运行下去。
二、python异常捕捉:
1、一般的python异常捕获语句:
try:
try_suite
except Exception1,Exception2,...,Argument:
exception_suite
...... #other exception block
else:
no_exceptions_detected_suite
finally:
always_execute_suite
2、python异常捕捉很灵活,try,except,finally自由组合。
try...except...
try...finally...
try...except...finally...
try...except...except...except...finally...等。
finally语句作用很大,通常我们不关心捕获到什么错误,而无论错误是否发生,有些代码必须要执行,比如文件关闭、释放锁、把数据库链接返还给连接池等,那么就可以把这些代码写到finally语句里。
>>> #coding:utf8
>>> filename = raw_input('请输入要打开的文件名: ')
请输入要打开的文件名: myfile.txt
>>> try:
print '执行打开文件前。'
f = open(filename)
print '执行打开文件后。'
except IOError,msg:
print '%s文件不存在!' %(filename)
finally:
print '执行finally。'
执行打开文件前。
myfile.txt文件不存在!
执行finally。
3、异常嵌套:
>>> try:
print '执行打开文件前。'
f = open(filename)
print '执行打开文件后。'
except IOError,msg:
print '%s文件不存在!' %(filename)
finally:
print '执行finally。'
try:
f.close()
except NameError,msg:
print '%s文件不存在,不需要关闭。' %(filename)
执行打开文件前。
myfile.txt文件不存在!
执行finally。
myfile.txt文件不存在,不需要关闭。
>>>
>>> try:
print '执行打开文件前。'
f = open(filename)
print '执行打开文件后。'
except IOError,e:
print '%s文件不存在!%s' %(filename,e)
finally:
print '执行finally。'
try:
f.close()
except NameError,e:
print '%s文件不存在,不需要关闭。%s' %(filename,e)
执行打开文件前。
myfile.txt文件不存在![Errno 2] No such file or directory: 'myfile.txt'
执行finally。
myfile.txt文件不存在,不需要关闭。name 'f' is not defined
>>>
5、用一个模块捕捉多个异常:
>>> try:
x = input('请输入被除数: ')
y = input('请输入除数: ')
print x/y
except(ZeroDivisionError,TypeError,NameError),e:
print e
请输入被除数: 6
请输入除数: 0
integer division or modulo by zero
>>>
>>> try:
x = input('请输入被除数: ')
y = input('请输入除数: ')
print x/y
except(ZeroDivisionError,TypeError,NameError),e:
print e
请输入被除数: B
name 'B' is not defined
>>>
>>> try:
x = input('请输入被除数: ')
y = input('请输入除数: ')
print x/y
except(ZeroDivisionError,TypeError,NameError),e:
print e
请输入被除数: 6
请输入除数: 'a'
unsupported operand type(s) for /: 'int' and 'str'
>>>
三、python异常抛出机制(raise):
1、如果在运行时发生异常,解释器会查找相应的处理语句(称为handler)。
2、如果在当前函数里没有找到,它会将异常传递给上层的调用函数,看上层能否处理。
3、如果在最外层(全局mail)还是没有找到,解释器就会退出 ,同时打印traceback以便让用户找出错误的原因。
>>> filename
'myfile.txt'
>>> if filename != 'myfile.excel':
raise ValueError('输入的文件名不正确!')
Traceback (most recent call last):
File "<pyshell#26>", line 2, in <module>
raise ValueError('输入的文件名不正确!')
ValueError: 输入的文件名不正确!
四、利用异常处理定位无从下手定位的出错问题
当遇到无从下手的异常时,比如执行.py文件一闪而过,或者使用py2exe生产.exe文件后,执行exe文件时没有任何信息,一闪而过,不知道哪个地方有问题,再比如更奇葩的情况是.py文件执行ok,.exe文件执行没有生效,这时利用异常捕获机制捕获sys.exc_info()信息对定位是非常有用的。
import sys
try:
put all your code here
except:
print "Unexpected error:", sys.exc_info() #返回出错信息
raw_input() #等待输入,相当于syspause
五、python常用异常类:
类名 | 描述 |
ArithmeticError | 所有数值计算错误的基类 |
AssertionError | 断言语句失败 |
AttributeError | 特性引用或赋值失败时已发 |
BaseException | 所有异常的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
EnvironmentError | 操作系统错误的基类 |
EOFError | 没有内建输入,到达EOF 标记 |
Exception | 所有异常的基类 |
FloatingPointError | 浮点计算错误 |
FutureWarning | 关于构造将来语义会有改变的警告 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
ImportError | 导入模块/对象失败 |
IndentationError | 缩进错误 |
IndexError | 序列中没有此索引(index) |
IOError | 试图打开不存在的文件(包括其它情况)时引发 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
KeyError | 在使用映射中不存在的键时引发 |
LookupError | 无效数据查询的基类 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 在找不到名字(变量)时引发 |
NotImplementedError | 尚未实现的方法 |
OSError | 操作系统错误 |
OverflowError | 数值运算超出最大限制 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
StandardError | 所有的内建标准异常的基类 |
StopIteration | 迭代器没有更多的值 |
SyntaxError | Python 语法错误 |
SyntaxWarning | 可疑的语法的警告 |
SystemError | 一般的解释器系统错误 |
SystemExit | 解释器请求退出 |
TabError | Tab 和空格混用 |
TypeError | 在內建操作或者函数应用于错误类型的对象时引发 |
UnboundLocalError | 访问未初始化的本地变量 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeError | Unicode 相关的错误 |
UnicodeTranslateError | Unicode 转换时错误 |
UserWarning | 用户代码生成的警告 |
ValueError | 在內建操作或者函数应用于正确类型的对象,但该对象使用不合适的值时引发。 |
Warning | 警告的基类 |
WindowsError | 系统调用失败 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |