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块是为异常处理事件提供清理机制,常用来关闭文件或释放系统资源
3.2.2执行顺序
没有异常,那么先执行else块,然后执行finally块
有异常,那么先执行except块,然后执行finally块,且如果该异常不属于任何一个except所定义的异常,也会先执行finally块,再交给解释器处理
3.2.3语句格式
try:
try_suite
except
exception_block1
except
exception_block2
...
except
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 自定义异常名,附加信息