程式在執行過程中可能會出現⼀些錯誤。比如: 使用了不存在的索引,兩個不同型別的資料相加…這些錯誤我們稱之為異常。
print
(a)# nameerror: name 'a' is not defined
異常處理:程式執行時出現異常,目的並不是讓我們的程式直接終止!python是希望在出現異常時,我們可以編寫**來對異常進行處理
當在函式**現異常時,如果在函式中對異常進行了處理,則異常不會在進進行傳播。如果函式中沒有對異常進行處理,則異常會繼續向函式呼叫傳播。
'''
異常的傳播
# 當在函式**現異常時,如果在函式中處理了異常。則異常不會在繼續傳播
# 如果在函式中沒有處理異常,則異常會繼續向函式呼叫出傳播
# 如果函式呼叫處處理了異常,則不在傳播。如果沒有處理則繼續向呼叫處傳播
# 直到傳遞到全域性作用域(主模組)如果依然沒有處理,則呈現終止,並顯示異常資訊
'''deffn(
):print
('hello fn'
)print(10
/0)# 存在異常
# 對異常不處理,呼叫會出錯
# fn() # zerodivisionerror: division by zero
# 對異常處理,呼叫不會出錯
try:
fn()# 函式呼叫處處理了異常,則不在傳播 結果為 hello fn
except
:pass
如果函式呼叫處處理了異常,則不再傳播異常,如果沒有處理則繼續向呼叫處傳播。直到傳遞到全域性作用域(主模組)如果依然沒有處理,則程式終止,並顯示異常資訊。
當程式執行過程**現異常以後,所有異常資訊會儲存到⼀個異常物件中。而異常傳播時,實際上就是異常物件拋給了呼叫處。
# 異常在函式的多個傳播
deffn()
:print
('hello fn'
)print(10
/0)def
fn2():
print
('hello fn2'
) fn(
)def
fn3():
print
('hello fn3'
) fn2(
)# fn3() # 結果為 hello fn2 hello fn2 hello fn3 然後報錯 zerodivisionerror: division by zero line 40 line 44 line 48 line 50
try:
fn3(
)# 結果為 hello fn2 hello fn2 hello fn3
except
:pass
異常物件
try:
print
('這是要測試的**'
)except
:print
('except後不跟任何內容,此時它會捕獲所有的異常)
except nameerror:
print
('except後加錯誤型別,代表只能識別這一類錯誤'
)except exception as e:
print
('exception是所有異常類父類 所有如果except後跟exception 它會捕獲到所有的異常'
)print
('e是儲存該類具體錯誤內容,type(e)儲存了錯誤的型別'
)else
:print
('這是沒有出錯執行的**'
)finally
:print
('這是無論是否出錯,都要執行的內容'
)
except後不跟任何內容,此時它會捕獲所有的異常
# print(a) # nameerror: name 'a' is not defined
try:
print
(a)except
:print
('except後不跟任何內容,此時它會捕獲所有的異常'
)
except後加錯誤型別,代表只能識別這一類錯誤,其他錯誤不能識別,出現其他錯誤會報錯
try
:print
(a)except nameerror:
print
('except後加錯誤型別,代表只能識別這一類錯誤,其他錯誤不能識別,出現其他錯誤會報錯'
)print
(nameerror,
type
(nameerror)
)# 結果
# except後加錯誤型別,代表只能識別這一類錯誤,其他錯誤不能識別,出現其他錯誤會報錯
# try
:print
(a)except zerodivisionerror:
# 0作為除數的異常
print
('except後加錯誤型別,代表只能識別這一類錯誤,其他錯誤不能識別,出現其他錯誤會報錯'
)print
(nameerror,
type
(nameerror)
)# 結果
# 報錯 nameerror: name 'a' is not defined
# 說明 except後加錯誤型別,代表只能識別這一類錯誤,其他錯誤不能識別,出現其他錯誤會報錯
exception是所有異常類父類 所有如果except後跟exception 它會捕獲到所有的異常。
e是儲存該類具體錯誤內容,type(e)儲存了錯誤的型別
try
:print
(a)except exception as e:
print
('exception是所有異常類父類 所有如果except後跟exception 它會捕獲到所有的異常'
)print
('e是儲存該類具體錯誤內容,type(e)儲存了錯誤的型別'
)print
('出現異常了'
, e,
type
(e))
# 結果
# exception是所有異常類父類 所有如果except後跟exception 它會捕獲到所有的異常
# e是儲存該類具體錯誤內容,type(e)儲存了錯誤的型別
# 出現異常了 name 'a' is not defined
try:
print(10
/0)except exception as e:
print
('exception是所有異常類父類 所有如果except後跟exception 它會捕獲到所有的異常'
)print
('e是儲存該類具體錯誤內容,type(e)儲存了錯誤的型別'
)print
('出現異常了'
, e,
type
(e))
# 結果
# exception是所有異常類父類 所有如果except後跟exception 它會捕獲到所有的異常
# e是儲存該類具體錯誤內容,type(e)儲存了錯誤的型別
# 出現異常了 division by zero
else是正確**後可以執行的
try
:print(1
)except
:print
('出錯了'
)else
:print
('這是正確**後可以執行的'
)# 結果 1 這是正確**後可以執行的
finally是是無論是否出錯,都要執行的內容
try
:print
('這是要測試的**'
)print
(a)# 異常
except exception as e:
print
('這是出錯要執行的內容'
)print
('出現異常了'
, e,
type
(e))
finally
:print
('這是無論是否出錯,都要執行的內容'
)# 結果
# 出現異常了 name 'a' is not defined
# 這是無論是否出錯,都要執行的內容
總結:try 是必須的、else 有沒有都可以、except 和 finally ⾄少有⼀個
try
:print
('這是要測試的**'
)print(2
)# 正常
except exception as e:
print
('這是出錯要執行的內容'
)print
('出現異常了'
, e,
type
(e))
else
:print
('這是正確**後可以執行的'
)finally
:print
('這是無論是否出錯,都要執行的內容'
)# 結果
# 這是要測試的**
# 2# 這是無論是否出錯,都要執行的內容
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 大家要學會看直譯器...
Python之異常處理
在程式執行過程中影響程式正常執行的內容,稱為異常 nameerror print a indexerror 索引錯誤 li 1,2,3,4 print li 8 keyerror d dict a 1,b 2 print d f zerodivisionerror 除0錯誤 print 10 2 2...
Python之異常處理
try ret int input num 正常執行的 print ret except valueerror 捕捉錯誤 print 請輸入數字 try ret int input num 正常執行的 print ret except valueerror 捕捉錯誤 print 請輸入數字 exce...