try..except...详细用法
1、如果一段代码有多种类型的错误,例如:
1 try:2 print('======1')3 name4 print('======2')5 l = [1, 2, 3]6 l[100]7 print('======3')8 d ={}9 d['name']10 print('======4')11
12 exceptNameError as e:13 print('---->', e)14
15 结果为:16
17 ======1
18 ----> name 'name' is not defined
定制什么类型异常,能捕获相应的异常,但是没有指定的异常的话还是会报错的,
1 try:2 print('======1')3 #name
4 print('======2')5 l = [1, 2, 3]6 l[100]7 print('======3')8 d ={}9 d['name']10 print('======4')11
12 exceptNameError as e:13 print('---->', e)14
15 结果为:16
17 ======1
18 Traceback (most recent call last):19 ======2
20 File "C:/Users/xu516/PycharmProjects/Python全栈开发/第三模块/面向对象编程/33 try...except详细用法.py", line 8, in
21 l[100]22 IndexError: list index out of range
这样的话,能不能写多个except呢,答案是可以的,这就是异常的多分支
1 try:2 print('======1')3 #name
4 print('======2')5 l = [1, 2, 3]6 #l[100]
7 print('======3')8 d ={}9 d['name']10 print('======4')11
12 exceptNameError as e:13 print('---->', e)14
15 exceptIndexError as e:16 print('---->', e)17
18 exceptKeyError as e:19 print('---->', e)20
21 结果为:22
23 ======1
24 ======2
25 ======3
26 ----> 'name'
这样就能捕获多种类型的异常,
多分支:被检测的代码块抛出的异常有多种可能性,并且我们需要针对每一种异常类型都定制专门的处理逻辑
1 try:2 print('======1')3 #name
4 print('======2')5 l = [1, 2, 3]6 #l[100]
7 print('======3')8 d ={}9 d['name']10 print('======4')11
12 exceptNameError as e:13 print('---->', e)14
15 exceptIndexError as e:16 print('---->', e)17
18 exceptKeyError as e:19 print('---->', e)20
21 print('after code')22
23 结果为:24
25 ======1
26 ======2
27 ======3
28 ----> 'name'
29 after code
捕获异常后的代码会正常执行,
万能异常:Exception ,被检测的代码块抛出的异常有多种可能性,并且我们针对所有的异常类型都只用一种处理逻辑就可以了,那就使用Exception,
1 try:2 print('======1')3 #name
4 print('======2')5 l = [1, 2, 3]6 #l[100]
7 print('======3')8 d ={}9 d['name']10 print('======4')11
12 exceptException as e:13 print('---->', e)14
15
16 print('after code')17
18 结果为:19
20 ======1
21 ======2
22 ======3
23 ----> 'name'
24 after code
当然,万能异常也可以和定制异常混合使用,除了我们关心的异常使用定制异常,其它的异常类型我们使用万能异常
代码示例如下:
1 try:2 print('======1')3 name4 print('======2')5 l = [1, 2, 3]6 l[100]7 print('======3')8 d ={}9 d['name']10 print('======4')11
12 exceptNameError as e:13 print('---->', e)14
15 exceptIndexError as e:16 print('---->', e)17
18 exceptKeyError as e:19 print('---->', e)20
21 exceptException as e:22 print('---->', e)23
24
25 print('after code')26
27 结果为:28
29 ======1
30 ----> name 'name' is notdefined31 after code
还可以在except后加else判断语句,该语句会在被检测的代码块没有发生异常时执行
如:
1 try:2 print('======1')3 #name
4 print('======2')5 l = [1, 2, 3]6 #l[100]
7 print('======3')8 d ={}9 #d['name']
10 print('======4')11
12 exceptNameError as e:13 print('---->', e)14
15 exceptIndexError as e:16 print('---->', e)17
18 exceptKeyError as e:19 print('---->', e)20
21 exceptException as e:22 print('---->', e)23
24 else:25 print('在被检测代码块没有发生异常时执行')26
27
28 print('after code')29
30 结果为:31
32 ======1
33 ======2
34 ======3
35 ======4
36 在被检测代码块没有发生异常时执行37 after code
加finally语句,不管被检测的代码块有没有发生异常都会执行
1 try:2 print('======1')3 #name
4 print('======2')5 l = [1, 2, 3]6 #l[100]
7 print('======3')8 d ={}9 d['name']10 print('======4')11
12 exceptNameError as e:13 print('---->', e)14
15 exceptIndexError as e:16 print('---->', e)17
18 exceptKeyError as e:19 print('---->', e)20
21 exceptException as e:22 print('---->', e)23
24 else:25 print('在被检测代码块没有发生异常时执行')26
27 finally:28 print('不管被检测的代码块有没有发生异常都会执行')29
30
31 print('after code')32
33 结果为:34
35
36 ======1
37 ======2
38 ======3
39 ----> 'name'
40 不管被检测的代码块有没有发生异常都会执行41 after code
finally的代码应用案例:
1 try:2 f = open('a.txt')3 print(next(f))4 print(next(f))5 print(next(f))6 print(next(f))7 print(next(f))8 print(next(f))9 print(next(f))10
11 finally:12 print('final')13 f.close()14
15 结果为:16
17 111
18 Traceback (most recent call last):19
20 222
21
22 333
23 File "C:/Users/xu516/PycharmProjects/Python全栈开发/第三模块/面向对象编程/33 try...except详细用法.py", line 42, in
24
25 444
26 print(next(f))27
28 StopIteration29 555
30 final