Python try except else使用詳解
在原本的try except結(jié)構(gòu)的基礎(chǔ)上,Python 異常處理機(jī)制還提供了一個(gè) else 塊,也就是原有 try except 語句的基礎(chǔ)上再添加一個(gè) else 塊,即try except else結(jié)構(gòu)。
使用 else 包裹的代碼,只有當(dāng) try 塊沒有捕獲到任何異常時(shí),才會得到執(zhí)行;反之,如果 try 塊捕獲到異常,即便調(diào)用對應(yīng)的 except 處理完異常,else 塊中的代碼也不會得到執(zhí)行。
舉個(gè)例子:
try:
result = 20 / int(input('請輸入除數(shù):'))
print(result)
except ValueError:
print('必須輸入整數(shù)')
except ArithmeticError:
print('算術(shù)錯誤,除數(shù)不能為 0')
else:
print('沒有出現(xiàn)異常')
print("繼續(xù)執(zhí)行")
可以看到,在原有 try except 的基礎(chǔ)上,我們?yōu)槠涮砑恿?else 塊?,F(xiàn)在執(zhí)行該程序:
請輸入除數(shù):4
5.0
沒有出現(xiàn)異常
繼續(xù)執(zhí)行
如上所示,當(dāng)我們輸入正確的數(shù)據(jù)時(shí),try 塊中的程序正常執(zhí)行,Python 解釋器執(zhí)行完 try 塊中的程序之后,會繼續(xù)執(zhí)行 else 塊中的程序,繼而執(zhí)行后續(xù)的程序。
讀者可能會問,既然 Python 解釋器按照順序執(zhí)行代碼,那么 else 塊有什么存在的必要呢?直接將 else 塊中的代碼編寫在 try except 塊的后面,不是一樣嗎?
當(dāng)然不一樣,現(xiàn)在再次執(zhí)行上面的代碼:
請輸入除數(shù):a
必須輸入整數(shù)
繼續(xù)執(zhí)行
可以看到,當(dāng)我們試圖進(jìn)行非法輸入時(shí),程序會發(fā)生異常并被 try 捕獲,Python 解釋器會調(diào)用相應(yīng)的 except 塊處理該異常。但是異常處理完畢之后,Python 解釋器并沒有接著執(zhí)行 else 塊中的代碼,而是跳過 else,去執(zhí)行后續(xù)的代碼。
也就是說,else 的功能,只有當(dāng) try 塊捕獲到異常時(shí)才能顯現(xiàn)出來。在這種情況下,else 塊中的代碼不會得到執(zhí)行的機(jī)會。而如果我們直接把 else 塊去掉,將其中的代碼編寫到 try except 的后面:
try:
result = 20 / int(input('請輸入除數(shù):'))
print(result)
except ValueError:
print('必須輸入整數(shù)')
except ArithmeticError:
print('算術(shù)錯誤,除數(shù)不能為 0')
print('沒有出現(xiàn)異常')
print("繼續(xù)執(zhí)行")
程序執(zhí)行結(jié)果為:
請輸入除數(shù):a
必須輸入整數(shù)
沒有出現(xiàn)異常
繼續(xù)執(zhí)行
可以看到,如果不使用 else 塊,try 塊捕獲到異常并通過 except 成功處理,后續(xù)所有程序都會依次被執(zhí)行。
python try except else finally 實(shí)例
class AError(Exception):
"""AError---exception"""
print('AError')
class BError(Exception):
"""BError---exception"""
print('BError')
try:
# raise AError
# raise BError
aaaaa()
except AError:
print("Get AError")
except BError:
print("Get BError")
except:
print("Get Exception")
else:
print("do else")
finally:
print("finally")
1.在上面所示的完整語句中try/except/else/finally所出現(xiàn)的順序必須是try-->except X-->except-->else-->finally,即所有的except必須在else和finally之前,else(如果有的話)必須在finally之前,而except X必須在except之前。否則會出現(xiàn)語法錯誤。
2.在上面的完整語句中,else語句的存在必須以except X或者except語句為前提,如果在沒有except語句的try block中使用else語句會引發(fā)語法錯誤。也就是說else不能與try/finally配合使用。
3.try成功進(jìn)else,不成功進(jìn)對應(yīng)的except;
4.不論是否成功except X,except的判定語句都會執(zhí)行,只是不進(jìn)入;對應(yīng)到以上程序就是不論哪種情況 AError BError都會打印,但是Get AError Get BError 只有拋對應(yīng)的異常時(shí)才會打印。
5.finally所有情況都會執(zhí)行,可以不寫,寫了就必須在所有except else等之后;
到此這篇關(guān)于Python try except else使用詳解的文章就介紹到這了,更多相關(guān)Python try except else內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python try except 捕獲所有異常的實(shí)例
- Python使用try except處理程序異常的三種常用方法分析
- Python異常處理:try、except、else、finally的全面解析
- 對python中的try、except、finally 執(zhí)行順序詳解
- Python中的異常處理try/except/finally/raise用法分析
- python try except返回異常的信息字符串代碼實(shí)例
- python嵌套try...except如何使用詳解
- python中try Except拋出異常的使用方式
- Python中 try / except / else / finally 異常處理方法詳解
相關(guān)文章
Python 模擬動態(tài)產(chǎn)生字母驗(yàn)證碼圖片功能
這篇文章主要介紹了Python 模擬動態(tài)產(chǎn)生字母驗(yàn)證碼圖片,這里給大家介紹了pillow模塊的使用,需要的朋友可以參考下2019-12-12
Python實(shí)現(xiàn)數(shù)據(jù)的序列化操作詳解
在日常開發(fā)中,對數(shù)據(jù)進(jìn)行序列化和反序列化是常見的數(shù)據(jù)操作,Python提供了兩個(gè)模塊方便開發(fā)者實(shí)現(xiàn)數(shù)據(jù)的序列化操作,即?json?模塊和?pickle?模塊。本文就為大家詳細(xì)講解這兩個(gè)模塊的使用,需要的可以參考一下2022-07-07
對python多線程中互斥鎖Threading.Lock的簡單應(yīng)用詳解
今天小編就為大家分享一篇對python多線程中互斥鎖Threading.Lock的簡單應(yīng)用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python數(shù)據(jù)類型之Set集合實(shí)例詳解
這篇文章主要介紹了Python數(shù)據(jù)類型之Set集合,結(jié)合實(shí)例形式詳細(xì)分析了Python數(shù)據(jù)類型中集合的概念、原理、創(chuàng)建、遍歷、交集、并集等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
Python3內(nèi)置模塊random隨機(jī)方法小結(jié)
這篇文章主要介紹了Python3內(nèi)置模塊random隨機(jī)方法小結(jié),random是Python中與隨機(jī)數(shù)相關(guān)的模塊,其本質(zhì)就是一個(gè)偽隨機(jī)數(shù)生成器,我們可以利用random模塊基礎(chǔ)生成各種不同的隨機(jī)數(shù),以及一些基于隨機(jī)數(shù)的操作,需要的朋友可以參考下2019-07-07

