異常機制已經成為衡量一門程式語言是否成熟的標準之一,使用異常處理機制的python程式有更好的容錯性,更加健康。
python的異常處理機制可以讓程式具有極好的容錯性。
使用try…except捕獲異常
語法結構如下:
try:
業務實現**
except (error1, error2,...) as e:
alert 輸入不合法
goto retry
如果執行try塊裡的邏輯**時出現異常,系統自動生成乙個異常物件,該物件被提交給python直譯器,這個過程稱為引發異常。
異常類的繼承體系
python的所有異常類的基類是baseexception,但如果使用者要實現自定義異常,應該繼承exception。
baseexception的主要子類就是exception,不管是系統的異常類,還是使用者自定義的異常類,都應該從exception派生。
import sys
try:
a = int(sys.ar**[1])
b = int(sys.ar**[2])
c = a / b
print("您輸入的兩個數相除的結果是:", c )
except indexerror:
print("索引錯誤:執行程式時輸入的引數個數不夠")
except valueerror:
print("數值錯誤:程式只能接收整數引數")
except arithmeticerror:
print("算術錯誤")
except exception:
print("未知異常")
實際程式設計時一定要記住:先捕獲小異常,再捕獲大異常!
多異常捕獲
python的乙個except塊可以捕獲多種型別的異常,只要將多個異常類用圓括號括起來,中間用逗號隔開即可-----其實就是構建多個異常類的元組
import sys
try:
a = int(sys.ar**[1])
b = int(sys.ar**[2])
c = a / b
print("您輸入的兩個數相除的結果是:", c )
except (indexerror, valueerror, arithmeticerror):
print("程式發生了陣列越界、數字格式異常、算術異常之一")
except:
print("未知異常")
else塊
在python的異常處理流程中還可新增乙個else塊,當try塊沒有出現異常時,程式會執行else塊。
如果希望某段**的異常能被後面 except 塊捕獲,那麼就應該將這段**放在 try塊的**之後;如果希望某段**的異常能向外傳播,那麼久應該將這段**放在else塊中。
使用finally**資源
為了保證一定能**在try塊中開啟的資源,異常處理機制提供了finally塊,不管try塊中的**是否出現異常,也不管哪乙個except塊被執行,甚至在try塊或except塊中執行了return語句,finally塊總會被執行。python完整的異常處理語法結構如下:
try:
業務實現**
except subexception as e:
異常處理塊1
except subexception2 as e:
異常處理塊2
...else:
正常處理塊
finally:
資源**塊
異常處理巢狀
在try塊、except塊、finally塊中包含乙個完整的異常處理流程的情形稱為異常處理巢狀。
引發異常
如果需要在程式中自行引發異常,可以使用raise語句。raise語句有三種常用的用法:
自定義異常類
使用者自定義異常都應該繼承exception基類或exception子類,在自定義異常類時只需要指定自定義異常類的父類即可
except和raise同時使用
在異常出現的當前方法中,程式只對異常進行部分處理,還有些處理需要在該方法的呼叫中才能完成,所以應該再次引發異常,讓該方法的呼叫者也能捕獲到異常。為了實現這種通過多個方法協作處理同乙個異常的情形,可以在except塊中結合raise語句來完成。
這種except和raise結合使用的情況再實際應用中非常常用。實際應該對異常處理通常分為兩個部分:1、應用後台需要通過日誌來記錄異常發生的詳細情況;2、應用還需要根據異常向應用使用者傳達某種提示。
raise不需要引數
使用raise語句時可以不帶引數,此時raise語句處於except塊中,它將會自動引發當前上下文啟用的異常;否則,通常預設引發runtimeerror異常
python專門提供了traceback模組來處理異常傳播軌跡,匯入traceback模組之後,提供了如下兩個常用方法。
成功的異常處理應該實現如下4個目標:
不要過度使用異常
過度使用異常主要表現在兩個方面:
不要使用過於龐大的try塊
try塊裡的**過於龐大,業務過於複雜,就會造成try塊**現異常的可能性大大增加,從而導致分析異常原因的難度也大大增加。
不要忽略捕獲到的異常
不要忽略異常!既然已捕獲到異常,那麼except塊理應做處理並修復異常。
1、提示使用者輸入乙個n,表示使用者接下來要輸入n個字串,程式嘗試將使用者輸入的每乙個字串用空格分割成兩個整數,並結算這兩個整數
整除的結果。
要求:使用異常處理機制來處理使用者輸入的各種錯誤,並提示使用者重新輸入。將最後計算的結果存入列表並列印
num = input("請輸入乙個n:")
num_list =
try:
i = 0
while(true):
num_str = input("請輸入以空格分隔的兩個整數:")
try:
x,y = num_str.split(' ')
print("%d整除%d的結果是:%d" %(int(x),int(y),int(x)//int(y)))
i +=1
if i>= int(num):
break
except valueerror:
print("必須輸入兩個以空格隔開的整數,請重新輸入!")
continue
except valueerror:
print("請輸入正整數!")
finally:
print("最終的結果列表是:%s" % num_list)
2、提示使用者輸入乙個整數,如果使用者輸入的整數是奇數,則輸出「有趣」;如果使用者輸入的整數是偶數,且在2~5 之間,則列印「沒意思」;
如果使用者輸入的整數是偶數,且在6~20 之間,則輸出「有趣」;如果輸入的整數是其他偶數,則列印「沒意思」。
要求:使用異常處理機制來處理使用者輸入的各種錯誤情況
n = input("請輸入乙個整數:")
try:
num = int(n)
while (num >= 0):
if num % 2 != 0:
print("有趣")
elif num % 2 == 0 and num >= 2 and num <= 5:
print("沒意思")
elif num % 2 == 0 and num >= 2 and num <= 5:
print("有趣1")
else:
print("沒意思1")
else:
print("不能輸入負數")
except valueerror:
print("請輸入整數!")
3、提供乙個字串元組,程式要求元組中每乙個元素的長度都在5~20 之間:否則, 程式引發異常。
str = ("python語言學習","瘋狂python學習","學習","23")
for i in str:
if len(i)>=5 and len(i)<=20:
print(i)
else:
print("元素:'%s' 長度必須在5~20之間!" % i)
4、提示使用者輸入x1, y1, x2, y2, x3, y3 六個數值,分別代表三個點的座標,程式判斷這三個點是否在同一條直線上。要求: 使用異常處理機制處理使用者輸入的各種錯誤情況,如果三個點不在同一條直線上,則程式出現異常
try:
x1, y1, x2, y2, x3, y3 = input('請依次輸入6個座標點以空格隔開').split(' ')
x1 = float(x1)
y1 = float(y1)
x2 = float(x2)
y2 = float(y2)
x3 = float(x3)
y3 = float(y3)
if x1 == 0 and x2 == 0 and x3 == 0:
print('三個點在一條直線上')
elif 0 in (x1, x2, x3):
raise exception('三個點不在同一直線上')
elif y1 / x1 == y2 / x2 and y1 / x1 == y3 / x3:
print('三個點在同一直線上')
else:
raise exception('三個點不在同一直線上')
except valueerror:
print('輸入的座標必須為數字!')
《瘋狂Python講義》之檔案IO
pathlib模組提供了一組物件導向的類,這些類可代表各種作業系統上的路徑,程式可通過這些類操作路徑。程式在建立purepath和path時,即可傳入單個路徑字串,也可以傳入多個路徑字串,purepath會將它們拼接成乙個字串。pp pureposixpath crazyit some path i...
《瘋狂Python講義》之函式和lambda表示式
函式就是python程式的重要組成單位,乙個python程式可以由很多個函式組成。定義函式和呼叫函式 定義函式的語法格式如下 def 函式名 形參列表 由0條到多條可執行語句組成的函式 return 返回值 如果程式需要有多個返回值,既可將多個值包裝成列表之後返回,也可直接返回多個值。如果pytho...
python之異常處理 Python之異常處理
異常物件 請大家執行如下 a 100 0 print a 就會發現直譯器顯示如下的錯誤提示 traceback most recent call last file x.py line 1,in a 100 0 zerodivisionerror division by zero 大家要學會看直譯器...