文章目錄
一、異常的概述
1、概述
在python中有兩類錯誤會引發異常,一類是語法錯誤比如異常的鎖進,異常的函數名稱等;還有一類就是邏輯錯誤,比如1/0,0由於0是無法當作除數的,所以也會拋出異常。
而當程序的某個環節出現異常時,則會導致整個程序崩潰中止。
2、異常的種類
python中一切皆對象,因此異常也是由類產生,所有異常類的基類都是BaseException
以下是常見的類的種類:
- AssertionError:當 assert 關鍵字後的條件爲假時,程序運行會停止並拋出 AssertionError 異常,assert關鍵字接下去會談到
- AttributeError:當試圖訪問的對象屬性不存在時拋出的異常
- IndexError:索引超出序列範圍會引發此異常
- KeyError:字典中查找一個不存在的關鍵字時引發此異常
- NameError:嘗試訪問一個未聲明的變量時,引發此異常
- TypeError:不同類型數據之間的無效操作
- ZeroDivisionError:除法運算中除數爲 0 引發此異常
- Exception:可以捕捉任何異常
二、異常捕捉語法
1、try…except
在try代碼塊中包裹的代碼出現異常的時候,就會被except捕捉執行except代碼塊中的代碼。異常處理完畢後會繼續運行try代碼塊後面的代碼。
示例中Exception可以捕捉任何異常,也可以替換成相應的異常類,如果except沒有捕捉到異常,則代碼正常向後運行
mystr = 'base'
try:
int(mystr)
except Exception as e:
print(e)
print("主邏輯")
###執行結果
invalid literal for int() with base 10: 'base'
主邏輯
2、try…except…else
else代碼快中的內容是當沒有出現異常的時候會執行的代碼
mystr = '111'
try:
int(mystr)
except Exception as e:
print(e)
else:
print("若代碼沒有異常則執行")
print("主邏輯")
###執行結果
若代碼沒有異常則執行
主邏輯
3、finally
finally中的代碼是無論出現異常與否都會執行的代碼
mystr = '111'
try:
int(mystr)
except Exception as e:
print(e)
else:
print("若代碼沒有異常則執行")
finally:
print("代碼無論是否有異常都會執行")
print("主邏輯")
### 執行結果
若代碼沒有異常則執行
代碼無論是否有異常都會執行
主邏輯
4、自定義拋出異常
4.1、在程序某處主動拋出異常
for i in range(10):
if i == 3:
raise ValueError("值爲3,退出")
else:
print(i)
###
0
1
2
Traceback (most recent call last):
File "/Users/huyinjie/PycharmProjects/study/linetest.py", line 3, in <module>
raise ValueError("值爲3,退出")
ValueError: 值爲3,退出
4.2、自定義異常
class MyError(BaseException):
def __init__(self,msg):
self.msg = msg
for i in range(5):
if i == 3:
raise MyError("拋出自定義異常")
else:
print(i)
5、斷言 assert
斷言會判斷後面表達式的值,若爲真,則繼續執行;若爲假則會拋出AssertionError異常。
assert expression[, arguments]
#這個if判斷和assert語法等價
if not expression:
raise AssertionError(arguments)
>>> assert 1==1 # 條件爲 true 正常執行
>>> assert 1==2 # 條件爲 false 觸發異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
def myres(name):
if name == 'hyj':
res = 1
else:
res = 0
return res
res = myres('yang')
assert res==1,'驗證不同過'
print("驗證通過")
###執行結果
Traceback (most recent call last):
File "/Users/huyinjie/PycharmProjects/study/linetest.py", line 9, in <module>
assert res==1,'驗證不同過'
AssertionError: 驗證不同過