编程时难免遇到问题,遇到问题时会导致其后代码不执行。为了解决,这里就使用了异常处理让程序继续执行。异常处理的好坏决定这个程序的鲁棒性。
一.try
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| try: def fn(n): a = [1,3,4] x = a[n] return x except IndexError: print("索引错啦") except ValueError: print('值错啦') else: print("没有异常") finally: print("不管有没有错误,都会执行")
fn(111)
|
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 没有异常 不管有没有错误,都会执行
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) Cell In[40], line 20 17 finally: 18 print("不管有没有错误,都会执行") ---> 20 fn(111)
Cell In[40], line 4, in fn(n) 2 def fn(n): 3 a = [1,3,4] ----> 4 x = a[n] 5 return x
IndexError: list index out of range
|
为什么会有问题呢?因为fn(111)调用没有在try里面进行,不算进行的try语句,所以不会执行异常处理。
正确用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| try: def fn(n): a = [1,3,4] x = a[n] return x fn(111) except IndexError: print("索引错啦") except ValueError: print('值错啦') else: print("没有异常") finally: print("不管有没有错误,都会执行")
|
结果:
不清楚错误类型时,可以不写except的错误类型,让它自动匹配所有类型。
就是得自己寻找异常类型,不会让程序出错。
1 2 3 4 5 6 7 8 9 10 11 12 13
| def fn(n): a = [1,3,4] x = a[n] print(x) try: fn(100) except: print("打印日志:程序有问题") else: print("程序没有问题")
|
结果:
二.raise
根据你设置的条件抛出一个错误,让程序进入异常状态
发送错误通知给调用者
1 2 3 4 5 6 7 8
|
def get_score(): x = int(input('请输入成绩:')) if 0 <= x <= 100: return x raise ValueError get_score()
|
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13
| --------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[48], line 8 6 return x 7 raise ValueError ----> 8 get_score()
Cell In[48], line 7, in get_score() 5 if 0 <= x <= 100: 6 return x ----> 7 raise ValueError
ValueError:
|
三.错误类型
ZeroDivisionError |
除(或取模)零 (所有数据类型) |
ValueError |
传入无效的参数 |
TypeError |
对类型无效的操作 |
IndexError |
序列中没有此索引(仅列表) |
KeyError |
映射中没有此键 |
NameError |
未声明/初始化对象 (没有属性) |
AttributeError |
对象没有这个属性 |
SyntaxError |
语法错误 |
ImportError |
导入模块/对象失败 |
RuntimeError |
一般的运行时错误 |
NotImplementedError |
尚未实现的方法 |
OSError |
操作系统错误 |