異常與錯誤的差別
在介紹異常處理之前就不能不說一下異常和錯誤的差別了:
錯誤有兩種:
- 文法錯誤:代碼不符合解釋器或者編譯器文法
- 邏輯錯誤:不完整或者不合法輸入或者計算出現問題
這些錯誤都會使程式崩掉。異常是程式運作時發生錯誤而産生的信号,由解釋器追蹤而抛出。異常不一定是壞的,它可能是我們主動抛出的,但有些異常是解釋器自動抛出的、我們無法預測使用者會做什麼(除非限制得很死)他們操作時也可能産生異常。是以我們要捕捉異常,并做相應的處理。
一般形式
先看一看異常處理的簡單形式:
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,,這樣會使得代碼維護困難。先上一張圖檔,主要是想展示它們之間的關系,隻畫了部分,有些異常類我就沒有畫出(主要是不知道)。

給一個表說明一下這些常見的異常類對應着什麼樣的異常
異常類 | 解釋 |
---|---|
StopIteration | 疊代器疊代完之後抛出的異常 |
AttributeError | 使用對象調用不存在的方法時抛出 |
ImportError | 導入找不到子產品,或在子產品中找不到名稱時抛出,其子類ModuleNotFoundError也有類似的意義 |
ValueError | 傳入的值不對 |
TypeError | 參數類型不正确 |
IndexError | 索引錯誤,通常是索引超出範圍 |
KeyError | 鍵錯誤,一般是鍵輸錯了 |
本文來自部落格園,作者:403·Forbidden,轉載請注明原文連結:https://www.cnblogs.com/lczmx/p/12213776.html