天天看點

Python異常處理

異常與錯誤的差別

在介紹異常處理之前就不能不說一下異常和錯誤的差別了:

錯誤有兩種:

  1. 文法錯誤:代碼不符合解釋器或者編譯器文法
  2. 邏輯錯誤:不完整或者不合法輸入或者計算出現問題

這些錯誤都會使程式崩掉。異常是程式運作時發生錯誤而産生的信号,由解釋器追蹤而抛出。異常不一定是壞的,它可能是我們主動抛出的,但有些異常是解釋器自動抛出的、我們無法預測使用者會做什麼(除非限制得很死)他們操作時也可能産生異常。是以我們要捕捉異常,并做相應的處理。

一般形式

先看一看異常處理的簡單形式: 

try:
    <代碼1>

except <什麼異常>  [as  <變量名>]:
    <代碼2>
           

首先程式會執行代碼1,假如代碼1執行過程中抛出異常了,那麼就會去except中的異常哪裡确認,抛出是否為你要捕捉的異常(except後面的異常)(包括是否為子類),假如是的話就會執行代碼2,不是的話就繼續往上冒泡,直到被處理否則解釋器就會報錯,整個程式就會退出。

下面展示一個小例子,對使用者輸入的資料進行類型轉化

name = input("name>>>")
age = input("age>>>")

while True:
    try:
        print("start type %s \n" % type(age))
        age = int(age)
        break
    except ValueError as e:
        print(type(e))
        print(e)
        age = input("age>>>")

print("end type%s \n" % type(age))
print(name)
print(age)

# ############  以下是指令行輸入############
"""
name>>>Jack
age>>>sb
start type <class 'str'>

<class 'ValueError'>    # e的類型為異常的類
invalid literal for int() with base 10: 'sb'    #  ,明顯我輸入的sb不能被轉化為int類型
age>>>22
start type <class 'str'>

end type<class 'int'>

Jack
22

Process finished with exit code 0    # 程式正常退出

"""
           

上面展示的:隻有使用者輸入數字才會正常運作,否則就會抛出異常ValueError我們可以選擇捕捉它,然後做異常處理。直到輸入的是正确的。

注:除了上述一樣定義的e包含錯誤資訊外,python的标準庫sys也有這樣的方法,那就是:sys.exc_info()

else

在異常處理的else表示的是在不抛出異常時執行。

a = "12"
b = Nonetry:
    b = int(a)
except ValueError as e:
    b = 111
else:
    print(a, b)
           

finally

finally在英語中有終于、 最終的意思,在python中finally表示的是無論有沒有異常,它都會執行(注:有異常時,必須要捕捉了異常,否者定義finally也不會被執行)。如下所示:

name = input("name>>>")
age = input("age>>>")

try:
    age = int(age)
except ValueError:
    print("ValueError ... ")
finally:
    print("finally ... ")

print(name, age)

# ########################
"""
# 第一次輸入

name>>>Jack
age>>>sb
ValueError ...
finally ...
Jack sb

# 第二次輸入

name>>>Tony
age>>>19
finally ...
Tony 19
"""
           

正如示例所示,無論我是否輸入錯了,都會列印 "finally ... ",證明了上面說的:無論異常還是正常的,finally都會執行。最後想展示以下python的一些常見異常類,以及它們的關系。避免以後隻會except Exception,,這樣會使得代碼維護困難。先上一張圖檔,主要是想展示它們之間的關系,隻畫了部分,有些異常類我就沒有畫出(主要是不知道)。

Python異常處理

給一個表說明一下這些常見的異常類對應着什麼樣的異常

異常類 解釋
StopIteration 疊代器疊代完之後抛出的異常
AttributeError 使用對象調用不存在的方法時抛出
ImportError 導入找不到子產品,或在子產品中找不到名稱時抛出,其子類ModuleNotFoundError也有類似的意義
ValueError 傳入的值不對
TypeError 參數類型不正确
IndexError 索引錯誤,通常是索引超出範圍
KeyError 鍵錯誤,一般是鍵輸錯了

本文來自部落格園,作者:403·Forbidden,轉載請注明原文連結:https://www.cnblogs.com/lczmx/p/12213776.html