Python----面向對象---try....except的詳細用法


try..except...詳細用法

1、如果一段代碼有多種類型的錯誤,例如:

 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 except NameError 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 except NameError 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 <module>
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 except NameError as e:
13     print('---->', e)
14 
15 except IndexError as e:
16     print('---->', e)
17 
18 except KeyError 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 except NameError as e:
13     print('---->', e)
14 
15 except IndexError as e:
16     print('---->', e)
17 
18 except KeyError 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 except Exception 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     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 except NameError as e:
13     print('---->', e)
14 
15 except IndexError as e:
16     print('---->', e)
17 
18 except KeyError as e:
19     print('---->', e)
20 
21 except Exception as e:
22     print('---->', e)
23 
24 
25 print('after code')
26 
27 結果為:
28 
29 ======1
30 ----> name 'name' is not defined
31 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 except NameError as e:
13     print('---->', e)
14 
15 except IndexError as e:
16     print('---->', e)
17 
18 except KeyError as e:
19     print('---->', e)
20 
21 except Exception 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 except NameError as e:
13     print('---->', e)
14 
15 except IndexError as e:
16     print('---->', e)
17 
18 except KeyError as e:
19     print('---->', e)
20 
21 except Exception 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 <module>
24 
25 444
26     print(next(f))
27 
28 StopIteration
29 555
30 final

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM