異常處理與斷言
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 3print(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:被除數寫成了0NameError:變數未定義
TypeError:不同型別資料進行相加
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