Python异常处理

        一、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文件不存在,不需要关闭。
>>>


4、使用系统异常描述(捕捉异常对象):

>>> 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    除(或取模)零 (所有数据类型)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值