當(dāng)一個(gè)程序發(fā)生異常時(shí),代表該程序在執(zhí)行時(shí)出現(xiàn)了非正常的情況,無(wú)法再執(zhí)行下去。默認(rèn)情況下,程序是要終止的。如果要避免程序退出,可以使用捕獲異常的方式獲取這個(gè)異常的名稱,再通過(guò)其他的邏輯代碼讓程序繼續(xù)運(yùn)行,這種根據(jù)異常做出的邏輯處理叫作異常處理。
開(kāi)發(fā)者可以使用異常處理全面地控制自己的程序。異常處理不僅僅能夠管理正常的流程運(yùn)行,還能夠在程序出錯(cuò)時(shí)對(duì)程序進(jìn)行必的處理。大大提高了程序的健壯性和人機(jī)交互的友好性。
1、先介紹try except
try:
可能產(chǎn)生異常的代碼塊
except [ (Error1, Error2, ... ) [as e] ]:
處理異常的代碼塊1
except [ (Error3, Error4, ... ) [as e] ]:
處理異常的代碼塊2
except [Exception]:
處理其它異常
該格式中,[] 括起來(lái)的部分可以使用,也可以省略。其中各部分的含義如下:
(Error1, Error2,...) 、(Error3, Error4,...):其中,Error1、Error2、Error3 和 Error4 都是具體的異常類型。顯然,一個(gè) except 塊可以同時(shí)處理多種異常。
[as e]:作為可選參數(shù),表示給異常類型起一個(gè)別名 e,這樣做的好處是方便在 except 塊中調(diào)用異常類型(后續(xù)會(huì)用到)。
[Exception]:作為可選參數(shù),可以代指程序可能發(fā)生的所有異常情況,其通常用在最后一個(gè) except 塊。
如:
try:
a = int(input("輸入被除數(shù):"))
b = int(input("輸入除數(shù):"))
c = a / b
print("您輸入的兩個(gè)數(shù)相除的結(jié)果是:", c )
except (ValueError, ArithmeticError) as e:
print("程序發(fā)生了數(shù)字格式異常、算術(shù)異常之一")
except :
print("未知異常")
print("程序繼續(xù)運(yùn)行")
此時(shí),有必要粘貼一張異常表,實(shí)際上,我覺(jué)得沒(méi)有必要都記住,只要是認(rèn)識(shí)會(huì)查即可,而且大部分我們也是直接try,except;


直接截圖,比較省事
=====================================================
在原本的
try except結(jié)構(gòu)的基礎(chǔ)上,python異常處理機(jī)制還提供了一個(gè) else 塊,也就是原有 try except 語(yǔ)句的基礎(chǔ)上再添加一個(gè) else 塊,即try except else結(jié)構(gòu)。
使用 else 包裹的代碼,只有當(dāng) try 塊沒(méi)有捕獲到任何異常時(shí),才會(huì)得到執(zhí)行;反之,如果 try 塊捕獲到異常,即便調(diào)用對(duì)應(yīng)的 except 處理完異常,else 塊中的代碼也不會(huì)得到執(zhí)行。
try:
result = 20 / int(input('請(qǐng)輸入除數(shù):'))
print(result)
except ValueError:
print('必須輸入整數(shù)')
except ArithmeticError:
print('算術(shù)錯(cuò)誤,除數(shù)不能為 0')
else:
print('沒(méi)有出現(xiàn)異常')
print("繼續(xù)執(zhí)行")
執(zhí)行結(jié)果:
請(qǐng)輸入除數(shù):4
5.0
沒(méi)有出現(xiàn)異常
繼續(xù)執(zhí)行
===================================================
還有一種拋出異常的方法,和C的assert行為差不多,就是raise
raise的用法,可以直接不帶有任何參數(shù)
也可以帶有參數(shù)
如下:
try:
a = input("輸入一個(gè)數(shù):")
if(not a.isdigit()):
raise ValueError("a 必須是數(shù)字")#也可以直接是raise
except ValueError as e:
print("引發(fā)異常:",repr(e))
raise
輸出結(jié)果:
輸入一個(gè)數(shù):a
引發(fā)異常: ValueError('a 必須是數(shù)字',)
Traceback (most recent call last):
File "D:\python3.6\1.py", line 4, in <module>
raise ValueError("a 必須是數(shù)字")
ValueError: a 必須是數(shù)字
==================================================
over~