异常就是导致代码无法正常运行的错误。
1.异常出现的原因
(1)当运用代码处理的问题不确定时;
(2)当从外部接口导入文件进行处理时;
(3)多行异常出现的原因:在嵌套调用时内部出现了问题,因而在外部调用时会逐层显示错误信息。
2.异常处理的结构
(1)分支结构
1 l = ['login', 'register']
2 for num, i in enumerate(l, 1):
3 print(num, i)
4 try:
5 num = int(input('num>>>')) # 当输入的值非数值时报错
6 except ValueError: # 当输入的值非数值时报错ValueError
7 print('请输入数字!')
8 try:
9 print(l[num - 1])
10 except IndexError: # 只能处理一种异常
11 print('输入的数字超过范围!')
(2)多分枝合并
1 l = ['login', 'register']
2 for num, i in enumerate(l, 1):
3 print(num, i)
4 try:
5 num = int(input('num>>>'))
6 print(l[num - 1])
7 except (ValueError, IndexError):
8 print('您输入的内容不合法!')
(3)万能异常
1 def buy():
2 print('订货')
3 1/0
4 def return_goods():
5 print('退货')
6 []
7 def check():
8 print('查看订单')
9 {}
10 def main():
11 l = [('订货', buy), ('退货', return_goods), ('查看订单', check)]
12 while True:
13 for num, i in enumerate(l, 1):
14 print(num, i[0])
15
16 num = int(input('num>>>'))
17 print(l[num - 1])
18 try:
19 func = l[num - 1][1]
20 func()
21 except Exception as e: # 将错误信息传给e
22 print(e)
23 print(e.args, e.__traceback__.tb_lineno, e.__traceback__.tb_frame)
24 # 通过e可以调用查看错误的详细信息
25 print('用户在操作%s时产生错误' % l[num - 1][0])
26 main()
(4)万能异常结合分支结构
1 def buy():
2 print('订货')
3 1/0
4 def return_goods():
5 print('退货')
6 []
7 def check():
8 print('查看订单')
9 {}
10 def main():
11 l = [('订货', buy), ('退货', return_goods), ('查看订单', check)]
12 while True:
13 for num, i in enumerate(l, 1):
14 print(num, i[0])
15 try:
16 num = int(input('num>>>'))
17 print(l[num - 1])
18 func = l[num - 1][1]
19 func()
20 except (ValueError, IndexError): # 当输入出现这两种错误时打印输入内容不合法
21 print('您输入的内容不合法!')
22 except Exception as e: # 万能异常捕捉应该放在分支后面执行
23 print(e)
24 # print(e.args, e.__traceback__.tb_lineno, e.__traceback__.tb_frame)
25 # 通过e可以调用查看错误的详细信息
26 print('用户在操作%s时产生错误' % l[num - 1][0])
27 main()
(5)else分支
1 try:
2 print('aaa')
3 name
4 [][1]
5 except NameError:
6 print('name error')
7 except IndexError:
8 print('index error')
9 else: # 当try中的代码不发生异常时执行else分支
10 print('else')
(6)finally分支
1 def func():
2 f = open('file')
3 try:
4 while True:
5 for line in f:
6 if line.startswith('a'):
7 return line
8 except:
9 print('有异常')
10 finally: # 即使return,也会先执行finally中的语句,再执行return
11 f.close() # 即使报错,也会先执行finally中的语句
12 # finally用于回收一些操作系统的资源:数据库连接,打开的文件句柄,网络连接
(7)主动抛出异常
raise ValueError('你输入有误')
(8)断言-语法
1 assert 1==2 # 只能接受一个布尔值
相当于if语句
1 if 1 == int(input()):
2 pass
3 else:
4 raise AssertionError