python异常处理

文章发布时间:

最后更新时间:

文章总字数:
753

预计阅读时间:
3 分钟

  编程时难免遇到问题,遇到问题时会导致其后代码不执行。为了解决,这里就使用了异常处理让程序继续执行。异常处理的好坏决定这个程序的鲁棒性。

一.try

  • try 其后跟要执行的代码

  • except 后跟要捕获的异常类型,可以捕获多个异常类型。其也可以跟 else 一起用

  • finally 后跟要执行的代码,无论是否有异常都会执行

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在外面调用是有问题的
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("不管有没有错误,都会执行")

结果:

1
2
索引错啦
不管有没有错误,都会执行

不清楚错误类型时,可以不写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("程序没有问题")

结果:

1
打印日志:程序有问题

二.raise

  • 根据你设置的条件抛出一个错误,让程序进入异常状态

  • 发送错误通知给调用者

1
2
3
4
5
6
7
8
# 写一个函数, get_score 函数,读取用户输入的整数成绩, 
# 成绩的正常值是0~100 之间,要求如果不在0~100 之间,报ValueError类型的错误
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 操作系统错误