异常处理与断言
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?
?
?
?
?
轉載于:https://www.cnblogs.com/XiaoJin0/p/10176398.html
總結
- 上一篇: 中核集团是国企还是央企
- 下一篇: 干洗店一个月能挣多少 比上班多赚三倍不