1. 程式人生 > >異常處理與斷言

異常處理與斷言

1、異常與錯誤

    錯誤 分為語法錯誤,邏輯錯誤;語法錯誤過不了python的直譯器,不符合python語言的規則,邏輯錯誤可通過直譯器,但是輸出錯誤

----------------->語法錯誤

1 def test()
2     pass
3 ——————————
4  File "E:/File/h.py/venv/新.py", line 17
5     def test()
6              ^
7 SyntaxError: invalid syntax

 

----------------->邏輯錯誤

1 x=0
2 y=5
3
print(y/x) 4 ------------------- 5 Traceback (most recent call last): 6 File "E:/File/h.py/venv/新.py", line 19, in <module> 7 print(y/x) 8 ZeroDivisionError: division by zero

  異常:程式執行過程中所出現的問題

2、標準異常型別

ZeroDiviceError:被除數寫成了0

 

NameError:變數未定義

 

TypeError:不同型別資料進行相加

 

IndexError:超出索引範圍

 

KeyError:沒有對應名稱的鍵

 

ValueError:將字元型資料轉換成整型資料

 

AttributeError:物件沒有對應名稱的屬性

 

3、異常處理(try--except)

  try--except是處理異常的一種手段。例如input輸入字串強制轉化為int時,可能會發生異常,若輸入數字字串,不會觸發異常,若輸入字母字串,如何強制轉化為int。

 1 try:
 2     age=input(">>>>")
 3     age=int(age)
4 print(age) 5 except ValueError as e: 6 print('valueerror') 7 print(e) 8 except KeyError as e: 9 print('keyerror') 10 print(e) 11 --------------------------------- 12 >>>>alex 13 valueerror 14 invalid literal for int() with base 10: 'alex'

  可以看到,當輸入字串‘alex’時,並不能把他轉化為int,會觸發異常。程式從try直接跳轉到except中,判斷異常屬於哪個異常型別與其匹配,可以看到,其為ValueError,跳轉到對應的except,執行相應的程式碼塊,需要注意的是as意外著將異常當作e,可列印e,看到異常;

 1 try:
 2     age=input(">>>>")
 3     age=int(age)
 4     print(age)
 5 # except ValueError as e:
 6 #     print('valueerror')
 7 #     print(e)
 8 except KeyError as e:
 9     print('keyerror')
10     print(e)
11 except Exception as e:
12     print('我可是什麼異常都可發現的')
13     print(e)
14 print('我還在執行哦')
15 ----------------------------16 >>>>sad
17 我可是什麼異常都可發現的
18 invalid literal for int() with base 10: 'sad'
19 我還在執行哦

!!!Exception異常型別可接受任何型別的異常,當異常try——except執行完,不會影響到後面程式碼的執行

!!!python找異常型別是從第一個except開始找,當找到了即整個except結束,即使可能後面有與之匹配的異常

 1 try:
 2     age=input(">>>>")
 3     age=int(age)
 4     print(age)
 5 except ValueError as e:
 6     print('valueerror')
 7     print(e)
 8 except KeyError as e:
 9     print('keyerror')
10     print(e)
11 except Exception as e:
12     print('我可是什麼異常都可發現的')
13     print(e)
14 print('我還在執行哦')
15 -----------------------------16 >>>>sad
17 valueerror
18 invalid literal for int() with base 10: 'sad'
19 我還在執行哦

  當找到第一個ValueError即停止,即使後面有接受所有異常型別的Exception;;;

   當try當中丟擲異常時,try異常後面的程式碼並不會執行,會跳轉到except中

4、try--except-else與finally

  

 1 try:
 2     age=input(">>>>")
 3     age=int(age)
 4     print(age)
 5 except ValueError as e:
 6     print('valueerror')
 7     print(e)
 8 except KeyError as e:
 9     print('keyerror')
10     print(e)
11 # except Exception as e:
12 #     print('我可是什麼異常都可發現的')
13 #     print(e)
14 else:
15     print('我是else')
16 finally:
17     print('我的作用是為異常做善後清理')
18 -------------------------------19 >>>>alex
20 valueerror
21 invalid literal for int() with base 10: 'alex'
22 我的作用是為異常做善後清理

當丟擲異常時,valueerror來接異常,執行後面程式碼,但是else程式碼並未執行,fnally執行了。沒有對比就沒有發現!

###當輸入123時輸出
--------------->>>>123
123
我是else
我的作用是為異常做善後清理

當輸入123時,程式碼並未觸發異常,自然不會觸發except,但是else,finally都觸發了!

  !!!try——except——else:當try中無異常丟擲的時候,else程式碼會執行

  !!!try——except——finally:無論try是否觸發異常,都會執行finally下的程式碼,finally的程式碼作用是善後,清理作用;例如當try中有異常有關檔案的操作時,觸發了異常,但檔案並未close,finally作用就能體現了;

5、raise主動觸發異常

  我們可以使用raise 異常型別(“引數”)來主動觸發,程式碼執行到此,會報異常資訊引數

1 if 1==1:
2     raise KeyError("出錯了")
3 print('我能不能執行呢')
4 ——————---------------
5 Traceback (most recent call last):
6   File "D:/MyPython/day2/venv/bokeyuan.py", line 51, in <module>
7     raise KeyError("出錯了")
8 KeyError: '出錯了'

 

  當然不會執行後面程式碼了

6、斷言(assert)

  斷言是python用來檢查一個語句,如果他為真,不做任何工作,如果為假,會報錯

1 assert 1==2
2 assert 1==1
3 -----------------------》》
4 Traceback (most recent call last):
5   File "D:/MyPython/day2/venv/bokeyuan.py", line 54, in <module>
6     assert 1==2
7 AssertionError