Python 错误与异常详解
1.错误和异常概念
错误
语法错误:代码不符合解释器或者编译器语法
逻辑错误:不完整或者不合法输入或者计算出现问题
异常
程序遇到逻辑或者算法问题
运行过程中计算机错误(内存不够或IO错误)
区别
错误是非正常的,是根本不应该出现的,比如缩进字符
异常是一种程序运行条件,而非严重错误,比如用户输入过大
注意
如果没有手动对异常进行处理,那么该异常就会被解释器捕获并处理,处理的方法为忽略或终止程序
2.常见错误
NameError--使用未定义的变量
SyntaxError--语法错误,常见程序格式不对。如if a后没有:
IOError--打开一个不存在的文件或文件
ZeroDivisionError--除零错误,即分母为零
ValueError--传入值无效,强制类型转换时产生。如a=int('dd')
KeyboardInterrupt--键盘中断错误,强制终止程序时产生。
3.异常处理
3.1运行前异常与运行时异常
运行前错误(在Python解释器将代码转换为字节码的过程中发现的错误,不可被try-except捕获到)
SyntaxError
运行时错误(程序运行起来才可以发现的错误,可被try-except捕获到)
NameError、IOError、ValueError
3.2try-except-else-finally语句
3.2.1注意点
如果except后不跟异常类,则表示捕获所有异常
如果try捕获到try_suite中的异常属于某一个except后跟的异常类,那么就会执行该except的exception_block,如果都不属于,就会交给解释器。
finally块的作用:无论是否有异常,都会执行finally块,所以finally块是为异常处理事件提供清理机制,常用来关闭文件或释放系统资源
3.2.2执行顺序
如果try_suite中没有异常,那么先执行else块,然后执行finally块
如果try_suite中有异常,那么先执行except块,然后执行finally块,且如果该异常不属于任何一个except所定义的异常,也会先执行finally块,再交给解释器处理
3.2.3语句格式
try:
try_suite
except [Exception1 [,e]]:
exception_block1
except [Exception2 [,e]]:
exception_block2
...
except [ExceptionN [,e]]:
exception_blockN
else:
none_execption
finally:
do_finally
4.with...as语句与上下文管理
格式
with context [as var]:
with_suite
作用
只是用来代替try-finally语句,不常用
context表达式返回的是一个对象
var用来保存context表达式返回的对象
with_suite使用var变量来对context返回的对象进行操作
原理
with语句是指上下文管理
上下文管理协议:包含__enter(self)和__exit__( self,exc_type,exc_value,traceback)两个方法,支持该协议的对象要实现这两个方法
上下文管理器:定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入和退出操作
进入上下文管理器:调用管理器__enter__()方法,如果设置as var语句,则var变量接收__enter__()方法返回值
退出上下文管理器:调用管理器__exit__()方法。注意,如果with_suite中有异常,则先回调用__exit__()方法,然后才会交给解释器处理
自定义上下文管理器
1 class Mycontext(object): 2 3 def __init__(self,name): 4 5 self.name=name 6 7 8 9 def __enter__(self): 10 11 print "__enter__" 12 13 return self 14 15 16 17 def __exit__(self,exc_type,exc_value,traceback): 18 19 print "__exit__" 20 21 print "***********************" 22 23 print "Error:",exc_type 24 25 print "info:",exc_value 26 27 print "traceback:",dir(traceback) 28 29 print "***********************" 30 31 32 33 if __name__ == '__main__': 34 35 with Mycontext('test context') as f: 36 37 print f.name 38 39 a
5. raise和assert语句
5.1raise语句
5.1.1作用
用于主动抛出异常
5.1.2格式
raise exception[, args]
5.1.3参数
exception--异常类
args--附带信息
5.1.4举例
raise NameError,11
raise NameError,"tttt"
raise NameError,('11','22')
raise NameError,['11','22']
raise NameError,{'11','22'}
5.2assert语句
5.2.1作用
用于检测一个表达式是否为真,如果为假,引发AssertionError错误
5.2.2格式
assert expression[, args]
5.2.3参数
expression--表达式
args--附带信息
5.2.4举例
assert 0,'ttt'
assert 1,'ttt'
assert 1==2 , 11
assert 1==2,"tttt"
assert 1==2,('11','22')
assert 1==2,['11','22']
assert 1==2,{'11','22'}
6. 标准异常和自定义异常
6.1标准异常
6.1.1定义
Python内建异常,程序执行前就已经存在
6.1.2官网
https://docs.python.org/2/library/exceptions.html
6.2自定义异常
6.2.1前提
自定义异常必须继承于Exception类或其子类
自定义异常只能主动触发
6.2.2格式
# -*- coding:utf8 -*- exception_dict={ 'FileNotExistException':u'文件不存在异常' } class YcException(Exception): def __init__(self, exception_type): super(YcException,self).__init__() self.exception_type=exception_type try: raise YcException(exception_dict['FileNotExistException']) except YcException as e: print e.exception_type
6.2.3触发
raise 自定义异常名,附加信息