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