异常处理与断言
1、異常與錯(cuò)誤
錯(cuò)誤 分為語(yǔ)法錯(cuò)誤,邏輯錯(cuò)誤;語(yǔ)法錯(cuò)誤過(guò)不了python的解釋器,不符合python語(yǔ)言的規(guī)則,邏輯錯(cuò)誤可通過(guò)解釋器,但是輸出錯(cuò)誤
----------------->語(yǔ)法錯(cuò)誤
1 def test() 2 pass 3 —————————— 4 File "E:/File/h.py/venv/新.py", line 17 5 def test() 6 ^ 7 SyntaxError: invalid syntax?
----------------->邏輯錯(cuò)誤
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? 異常:程序運(yùn)行過(guò)程中所出現(xiàn)的問(wèn)題
2、標(biāo)準(zhǔn)異常類型
ZeroDiviceError:被除數(shù)寫成了0?
NameError:變量未定義?
TypeError:不同類型數(shù)據(jù)進(jìn)行相加?
IndexError:超出索引范圍?
KeyError:沒(méi)有對(duì)應(yīng)名稱的鍵?
ValueError:將字符型數(shù)據(jù)轉(zhuǎn)換成整型數(shù)據(jù)?
AttributeError:對(duì)象沒(méi)有對(duì)應(yīng)名稱的屬性?
3、異常處理(try--except)
try--except是處理異常的一種手段。例如input輸入字符串強(qiáng)制轉(zhuǎn)化為int時(shí),可能會(huì)發(fā)生異常,若輸入數(shù)字字符串,不會(huì)觸發(fā)異常,若輸入字母字符串,如何強(qiáng)制轉(zhuǎn)化為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'可以看到,當(dāng)輸入字符串‘a(chǎn)lex’時(shí),并不能把他轉(zhuǎn)化為int,會(huì)觸發(fā)異常。程序從try直接跳轉(zhuǎn)到except中,判斷異常屬于哪個(gè)異常類型與其匹配,可以看到,其為ValueError,跳轉(zhuǎn)到對(duì)應(yīng)的except,執(zhí)行相應(yīng)的代碼塊,需要注意的是as意外著將異常當(dāng)作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('我可是什么異常都可發(fā)現(xiàn)的') 13 print(e) 14 print('我還在執(zhí)行哦') 15 ----------------------------》 16 >>>>sad 17 我可是什么異常都可發(fā)現(xiàn)的 18 invalid literal for int() with base 10: 'sad' 19 我還在執(zhí)行哦!!!Exception異常類型可接受任何類型的異常,當(dāng)異常try——except執(zhí)行完,不會(huì)影響到后面代碼的執(zhí)行
!!!python找異常類型是從第一個(gè)except開始找,當(dāng)找到了即整個(gè)except結(jié)束,即使可能后面有與之匹配的異常
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('我可是什么異常都可發(fā)現(xiàn)的') 13 print(e) 14 print('我還在執(zhí)行哦') 15 -----------------------------》 16 >>>>sad 17 valueerror 18 invalid literal for int() with base 10: 'sad' 19 我還在執(zhí)行哦當(dāng)找到第一個(gè)ValueError即停止,即使后面有接受所有異常類型的Exception;;;
? 當(dāng)try當(dāng)中拋出異常時(shí),try異常后面的代碼并不會(huì)執(zhí)行,會(huì)跳轉(zhuǎn)到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('我可是什么異常都可發(fā)現(xiàn)的') 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 我的作用是為異常做善后清理
當(dāng)拋出異常時(shí),valueerror來(lái)接異常,執(zhí)行后面代碼,但是else代碼并未執(zhí)行,fnally執(zhí)行了。沒(méi)有對(duì)比就沒(méi)有發(fā)現(xiàn)!
###當(dāng)輸入123時(shí)輸出 ---------------》 >>>>123 123 我是else 我的作用是為異常做善后清理當(dāng)輸入123時(shí),代碼并未觸發(fā)異常,自然不會(huì)觸發(fā)except,但是else,finally都觸發(fā)了!
!!!try——except——else:當(dāng)try中無(wú)異常拋出的時(shí)候,else代碼會(huì)執(zhí)行
!!!try——except——finally:無(wú)論try是否觸發(fā)異常,都會(huì)執(zhí)行finally下的代碼,finally的代碼作用是善后,清理作用;例如當(dāng)try中有異常有關(guān)文件的操作時(shí),觸發(fā)了異常,但文件并未close,finally作用就能體現(xiàn)了;
5、raise主動(dòng)觸發(fā)異常
我們可以使用raise 異常類型(“參數(shù)”)來(lái)主動(dòng)觸發(fā),代碼執(zhí)行到此,會(huì)報(bào)異常信息參數(shù)
1 if 1==1: 2 raise KeyError("出錯(cuò)了") 3 print('我能不能執(zhí)行呢') 4 ——————--------------- 5 Traceback (most recent call last): 6 File "D:/MyPython/day2/venv/bokeyuan.py", line 51, in <module> 7 raise KeyError("出錯(cuò)了") 8 KeyError: '出錯(cuò)了'?
當(dāng)然不會(huì)執(zhí)行后面代碼了
6、斷言(assert)
斷言是python用來(lái)檢查一個(gè)語(yǔ)句,如果他為真,不做任何工作,如果為假,會(huì)報(bào)錯(cuò)
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?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/XiaoJin0/p/10176398.html
總結(jié)
- 上一篇: 中核集团是国企还是央企
- 下一篇: 干洗店一个月能挣多少 比上班多赚三倍不