Python异常处理
日常小笔记
常见异常分类
异常名称 |
触发条件 |
AssertionError |
assert 语句类似于判断语句if, 但是assert语句后面condition为假的时候, 程序将停止并抛出AssertionError异常. assert语句一般是在测试程序的过程中在代码种置入的检查点. |
AttributeError |
当试图访问的对象属性不存在时抛出的异常 |
IndexError |
在使用序列的时候常常会遇到IndexError异常, 原因是索引超出序列范围的内容. |
KeyError |
当试图在字典中查找一个不存在的关键字时就会引发KeyError异常,因此建议使用dect.get()方法. |
NameError |
当尝试访问一个不存在的变量时,Python会抛出一个NameError异常. |
OSError |
顾名思义是操作系统产生的异常, 像打开一个不存在的文件会引发FileNotFoundError, 而这个FileNotFoundError是OSError的子类 |
SyntaxError |
如果遇到SyntaxError是Python的语法错误,这时Python代码宾不能继续执行,你应该先找到并改正错误. |
TypeError |
不同类型之间的无效操作, 有些类型不同是不能相互计算的,否则会抛出这个异常. 例如 1 + ‘1’ |
ZeroDivisionError |
除数为0的异常 |
try-except 语句
和 C/java 一样的 try-catch 一样, Python 提供了try - except 语句
语法
try: f = open('test') print(f.read()) f.close() except OSError: print("Some errors occured while open the file!")
|
- 但是我们知道, OSError有很多种, 所以我们可能会更在意错误的具体内容, 这里可以使用as把具体的错误信息给打印出来:
try: f = open('test') print(f.read()) f.close() except OSError as reason: print("some errors:"+ str(reason))
|
多个异常
try: f = open('test') print(f.read()) f.close() except OSError as reason: print("some errors:"+ str(reason)) except TypeError: print('type error occured!')
|
try: f = open('test') print(f.read()) f.close() except (OSError, TypeError) as reason: print("some errors:"+ str(reason))
|
try: f = open('test') print(f.read()) f.close() except : print("some errors")
|
try-finally 语句
一句话解释就是, 和java几乎一样.
try: f = open('test') print(f.read()) except : print("some errors") finally: f.close()
Traceback (most recent call last): File "ex.py", line 7, in <module> f.close() NameError: name 'f' is not defined
|
- 这是因为, 如果test文件不存在, f对应的文件对象根本没有被创建, 所以在finally 中不能 close它. 解决方法如下:
try: f = open('test') print(f.read()) except : print("some errors") finally: if 'f' in locals(): f.close() print("closed")
|
- locals() 这个BIF返回当前作用域所有变量的集合, 如果这个变量没有被定义, 就不会执行close();
raise 语句
和学过的throw 作用相同. 主动抛出一个异常,
f = open('test','w') if f not in locals(): raise FileNotFoundError
|
丰富的else
Python中的else 不仅能和if搭配, 还能和 while/for, 甚至能和try搭配.
要么怎样, 否则怎样
干完了能怎样, 干不完? 哼~
def showMaxFactor(num): count = num // 2 while count > 1: if num % count == 0: print('%d 最大公约数是 %d'%(num,count)) break; count -= 1 else: print('%d 是一个素数!'% num)
|
没有问题? 好! 那就干吧!
try: int('abc') except ValueError as reason: print(str(reason)) else: print('没毛病~')
|
with语句
with语句在某些特定的场合简化了异常处理. 具体解释如下:
使用with语句, 该对象必须实现满足上下文管理协议: 要包含这两个方法的实现.
支持上下文管理协议的对象, 也叫上下文管理器. 运行时上下文通过调用 ,一个在语句体执行前运行, 一个在语句体执行后执行.
- 上下文表达式, 跟随在with语句后的表达式, 该表达式要返回一个上下文管理器对象.
- 语句体: with语句包裹起来的代码.
with语句的基本语法形式
with context_expression [as target(s)]:
|
一个例子
with open('test') as f: for each_line in f: print(each_line)
|
总结
这家伙很懒, 什么都没有留下.