异常处理
笔记
Python 标准异常总结
- BaseException:所有异常的 基类
- Exception:常规异常的 基类
- StandardError:所有的内建标准异常的基类
- ArithmeticError:所有数值计算异常的基类
- FloatingPointError:浮点计算异常
- OverflowError:数值运算超出最大限制
- ZeroDivisionError:除数为零
- AssertionError:断言语句(assert)失败
- AttributeError:尝试访问未知的对象属性
- EOFError:没有内建输入,到达EOF标记
- EnvironmentError:操作系统异常的基类
- IOError:输入/输出操作失败
- OSError:操作系统产生的异常(例如打开一个不存在的文件)
- WindowsError:系统调用失败
- ImportError:导入模块失败的时候
- KeyboardInterrupt:用户中断执行
- LookupError:无效数据查询的基类
- IndexError:索引超出序列的范围
- KeyError:字典中查找一个不存在的关键字
- MemoryError:内存溢出(可通过删除对象释放内存)
- NameError:尝试访问一个不存在的变量
- UnboundLocalError:访问未初始化的本地变量
- ReferenceError:弱引用试图访问已经垃圾回收了的对象
- RuntimeError:一般的运行时异常
- NotImplementedError:尚未实现的方法
- SyntaxError:语法错误导致的异常
- IndentationError:缩进错误导致的异常
- TabError:Tab和空格混用
- SystemError:一般的解释器系统异常
- TypeError:不同类型间的无效操作
- ValueError:传入无效的参数
- UnicodeError:Unicode相关的异常
- UnicodeDecodeError:Unicode解码时的异常
- UnicodeEncodeError:Unicode编码错误导致的异常
- UnicodeTranslateError:Unicode转换错误导致的异常
例:
语法错误:SyntaxError
>>> print "Hellp World"
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hellp World")?
除以0错误:ZeroDivisionError
>>> 4/0
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
4/0
ZeroDivisionError: division by zero
列表下标越界:IndexError
>>> alist=[1,2,3,4]
>>> alist[4]
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
alist[4]
IndexError: list index out of range
类型错误:TypeError
>>> mix=['Connor','Bruce','John','Alice',7,3,9]
>>> mix.sort()
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
mix.sort()
TypeError: '<' not supported between instances of 'int' and 'str'
访问变量不存在:NameError
>>> x
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
x
NameError: name 'x' is not defined
字典关键字不存在:KeyError
>>> adict={"A":1,"B":2,"C":3,"D":4}
>>> adict["E"]
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
adict["E"]
KeyError: 'E'
未知的变量属性:AttributeError
>>> alist=[1,2,3,4]
>>> alist.sorted()
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
alist.sorted()
AttributeError: 'list' object has no attribute 'sorted'
异常体系内部有层次关系,Python异常体系中的部分关系如下所示:
Python标准警告总结
- Warning:警告的基类
- DeprecationWarning:关于被弃用的特征的警告
- FutureWarning:关于构造将来语义会有改变的警告
- UserWarning:用户代码生成的警告
- PendingDeprecationWarning:关于特性将会被废弃的警告
- RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
- SyntaxWarning:可疑语法的警告
- ImportWarning:用于在导入模块过程中触发的警告
- UnicodeWarning:与Unicode相关的警告
- BytesWarning:与字节或字节码相关的警告
- ResourceWarning:与资源使用相关的警告
try - except 语句
try :
检测范围
except Exception[as reason] :
出现异常后的处理代码
1.首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)
2.如果没有异常发生,忽略 except 子句, try 子句执行后结束。
3.如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略 。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行 。最后执行 try 语句之后的代码。
4.如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
补:
输出原因:
except TypeError as error:
print(‘类型出错\n原因是:’ + str(error))
一个 try 语句可能包含多个 except 子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
x = dict1['y']
except LookupError:
print('查询错误')
except KeyError:
print('键错误')
else:
print(x)
# 查询错误
注: try-except-else 语句尝试查询不在 dict 中的键值对,从而引发了异常。这一异常准确地说应属于 KeyError ,但由于 KeyError 是 LookupError 的子类,且将 LookupError 置于 KeyError 之前,因此程序优先执行该 except 代码块。所以,使用多个 except 代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常
try - except - finally 语句
try :
检测范围
except Exception[as reason]:
出现异常后的处理代码
finally :
无论如何都会被执行的代码
def divide(x, y):
try:
result = x / y
print("result is", result)
except ZeroDivisionError:
print("division by zero!")
finally:
print("executing finally clause")
# executing finally clause
# TypeError: unsupported operand type(s) for /: 'str' and 'str'
注: 如果一个异常在 try 子句里被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。
try - except - else 语句
try :
检测范围
except :
出现异常后的处理代码
else :
如果没有异常执行这块代码
注意: else 语句的存在必须以 except 语句的存在为前提,在没有 except 语句的 try 语句中使用 else 语句,会引发语法错误。
raise语句
Python 使用 raise 语句抛出一个指定的异常。
抛出异常使用 raise 语句。在代码中,raise 语句包含以下部分:
• raise 关键字;
• 对 Exception 函数的调用;
• 传递给 Exception 函数的字符串,包含有用的出错信息。
try:
raise NameError('HiThere')
except NameError as error:
print('An exception flew by! '+str(error))
结果:
>>>
=============== RESTART: D:\BaiduNetdiskDownload\python3\练习.py ===============
An exception flew by! HiThere
作业
程序:
import random
secret=random.randint(0,100)
i=1
print("猜测一个0到100之间的整数")
while True:
print("第%d次猜,请输入一个整形数字:" % i)
i+=1
try:
a=int(input())
except ValueError:
print("输入无效")
continue
if a==secret:
print("恭喜你猜到了这个数字是:%d"% a)
break
elif a>secret:
print("太大")
else:
print("太小")
结果:
=============== RESTART: D:\BaiduNetdiskDownload\python3\练习.py ===============
猜测一个0到100之间的整数
第1次猜,请输入一个整形数字:
50
太小
第2次猜,请输入一个整形数字:
de
输入无效
第3次猜,请输入一个整形数字:
的
输入无效
第4次猜,请输入一个整形数字:
75
太小
第5次猜,请输入一个整形数字:
90
太大
第6次猜,请输入一个整形数字:
77
太小
第7次猜,请输入一个整形数字:
85
太小
第8次猜,请输入一个整形数字:
88
太大
第9次猜,请输入一个整形数字:
86
恭喜你猜到了这个数字是:86