python常见异常总结详见Python标准异常总结
当列表为空时,使用assert len(list) > 0 会抛出AssertionError异常
AttributeError,当使用列表调用一个列表没有的方法时,会抛出该异常,如:list.fishc
IndexError 索引的值超出序列的范围
KeyError 访问字典没有的键,会报此错误,所以当访问键时可以使用get方法来获取,若没有则不返回,但是不会报错
NameError 访问一个不存在的变量
OSError 有很多, 比如说文件不存在,
SyntaxError 语法错误,编译不通过,如果在python3中使用python2的语法输出,就会报错
TypeError 1 + ‘1’ 数字1加一个字符串的1,python不支持隐士的类型转换,是强语言类型
ZeroDivisionError 除数不能为零 5 / 0
如何检测和处理异常:
通过try …except…语句处理异常
raise语句引出异常
>>> raise NameError
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
raise NameError
NameError
>>> raise NameError('变量不存在引起的异常') # 括号中为对异常的解释
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
raise NameError('变量不存在引起的异常')
NameError: 变量不存在引起的异常
异常中else的使用
- 不执行else中的语句
try中的代码正常执行才会执行else中的语句,如果出现异常,else中的语句不会被执行
try:
int('abc')
except ValueError as reason:
print('出错啦:' + str(reason))
else:
print('没有任何异常')
执行结果如下:
>>>
======================= RESTART: F:/Pythonspace/else_1.py ======================
出错啦:invalid literal for int() with base 10: 'abc'
- 执行else中的语句
try:
print(int('123'))
except ValueError as reason:
print('出错啦:' + str(reason))
else:
print('没有任何异常')
# 程序执行结果如下
>>>
======================= RESTART: F:/Pythonspace/else_1.py ======================
123
没有任何异常
finally的使用
finally后的语句无论如何都会执行
try:
f = open('data.txt','w')
for each_line in f:
print(each_line)
except OSError as reason:
print('出错啦:' + str(reason))
finally:
f.close()
# 执行结果如下:
>>>
================ RESTART: C:/Users/asus/Desktop/file_text.py ================
出错啦:not readable
with
使用with语句可以自动在文件结束调用时关闭文件,简化代码,实现如下:
try:
with open('data.txt','w') as f:
for each_line in f:
print(each_line)
except OSError as reason:
print('出错啦:' + str(reason))
with的本质–上下文管理器
任何实现了__enter__()和__exit__()方法的对象都可以称为上下文管理器,上下文管理器对象可以使用with关键字。也就是说任何实现了enter和exit内置魔法方法的类都可以称为上下文管理器,由这个类创建的对象称为上下文管理器对象。比如上面代码中的f。
用contextmanager装饰器实现上下文管理器
python提供了一个装饰器contextmanager,它的主要实现方式是通过yield将函数分割成两个部分,分割之前的语句在enter方法中执行,分割之后的语句在exit方法中执行,yield之后紧跟的变量是函数的返回值
from contexlib import contextmanager
@contextmanager
def open_file(path,operation):
f = open(path,operation)
yeild f
f.close()
with open_file(data.txt', 'w') as f:
f.wirte('Python')