《瘋狂Python講義》之異常處理

2021-10-01 13:55:45 字數 4796 閱讀 6422

異常機制已經成為衡量一門程式語言是否成熟的標準之一,使用異常處理機制的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 大家要學會看直譯器...