深入了解Python的異常處理機(jī)制
什么是異常?
def num(a, b):
a = int(a)
b = int(b)
result = a / b
print(result)
上面是一個(gè)很簡(jiǎn)單的除法的函數(shù),語(yǔ)法上沒(méi)有任何問(wèn)題。
但是如果調(diào)用函數(shù)的時(shí)候,傳入字符串。則會(huì)拋出異常ValueError。且后續(xù)代碼不會(huì)執(zhí)行

再比如除數(shù)是0。那也將拋出異常ZeroDivisionError。且后續(xù)代碼不會(huì)執(zhí)行

異常處理
格式
try:
#程序代碼
except [errorNmae]:
#出現(xiàn)異常后的處理代碼
[else:]
#當(dāng)try中代碼沒(méi)有問(wèn)題時(shí),會(huì)執(zhí)行else。但是try中不能有retrun
[finally:]
#最后一定會(huì)被執(zhí)行的代碼
try-except?
格式一-try...except...
try:
num('a', 'b')
except:
print('你的程序出現(xiàn)了大問(wèn)題!??!')
print('--------->end')
通過(guò)try-except處理異常,當(dāng)捕獲到異常時(shí),將執(zhí)行except部分的代碼。且程序不會(huì)終端,繼續(xù)向下執(zhí)行。

格式二-try...except {errorName}...
上述處理異常的時(shí)候沒(méi)有區(qū)分異常情況。也可以捕獲異常的name,進(jìn)行不同的處理。
try:
num('a', 'b')
except ValueError:
print('你的參數(shù)格式寫(xiě)的不對(duì)!??!')
except ZeroDivisionError:
print('你的除數(shù)是0?。。?)
print('--------->end')

try:
num(10, 0)
except ValueError:
print('你的參數(shù)格式寫(xiě)的不對(duì)?。。?)
except ZeroDivisionError:
print('你的除數(shù)是0?。。?)
print('--------->end')

格式三-try...except {errorName} as key...
except {errorName} as key。會(huì)將報(bào)錯(cuò)的信息賦值給key
注意:Python中的錯(cuò)誤類(lèi)型也是class,所有錯(cuò)誤類(lèi)型都繼承自BaseException。所以excpt使用時(shí)要注意,如果錯(cuò)誤類(lèi)型還有子類(lèi)型,也會(huì)將子類(lèi)型一網(wǎng)打盡。
try:
num(10, 0)
except ValueError as error_msg_value:
print('你的參數(shù)格式寫(xiě)的不對(duì)?。?!', error_msg_value)
except ZeroDivisionError as error_msg_zero:
print('你的除數(shù)是0!?。?, error_msg_zero)
print('--------->end')


這種使用errorName捕獲異常的情況。如果異常沒(méi)有被捕獲到,會(huì)一直向上拋,最終被python解釋器不過(guò)。打印錯(cuò)誤信息。

try-except-finally
無(wú)論是否拋出異常,最后finally都會(huì)執(zhí)行。
try:
num('a', 'b')
except ZeroDivisionError as error_msg_zero:
print('你的除數(shù)是0?。。?, error_msg_zero)
finally:
print('無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行')
print('--------->end')
-------------
輸出:
你的除數(shù)是0?。?! division by zero
無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行
--------->end
但是如果異常沒(méi)有except沒(méi)有捕獲到異常,異常最后由python解釋器拋出。那么finally執(zhí)行完后,后續(xù)的代碼就不會(huì)執(zhí)行了。
try:
num('a', 'b')
# except ValueError as error_msg_value:
# print('你的參數(shù)格式寫(xiě)的不對(duì)?。?!', error_msg_value)
except ZeroDivisionError as error_msg_zero:
print('你的除數(shù)是0?。?!', error_msg_zero)
finally:
print('無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行')
print('--------->end')

try-except-else
當(dāng)try中代碼沒(méi)有問(wèn)題時(shí),會(huì)執(zhí)行else。但是try中不能有retrun。
try:
num(10, 2)
except ValueError as error_msg_value:
print('你的參數(shù)格式寫(xiě)的不對(duì)?。?!', error_msg_value)
except ZeroDivisionError as error_msg_zero:
print('你的除數(shù)是0?。?!', error_msg_zero)
else:
print('else')
finally:
print('無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行')
print('--------->end')
?---------------
輸出:
5.0
else
無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行
--------->end
拋出異常
格式
raise errorName('error message')
錯(cuò)誤類(lèi)型名可以自定義,但盡量使用Python內(nèi)置錯(cuò)誤類(lèi)型。
def num(a, b):
result = a / b
print(result)
if result < 10:
raise ValueError('商小于10,不符合預(yù)期。')
num(10, 2)
?
raise還可以將一個(gè)錯(cuò)誤類(lèi)型轉(zhuǎn)換為另一個(gè)錯(cuò)誤類(lèi)型
def ch_type():
try:
result = 10 / 0
except ZeroDivisionError as err_msg:
raise Exception(err_msg)
ch_type()
原本錯(cuò)誤類(lèi)型ZeroDivisionError,改成了Exception。

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
python嵌套函數(shù)使用外部函數(shù)變量的方法(Python2和Python3)
這篇文章主要介紹了python嵌套函數(shù)使用外部函數(shù)變量的方法,需要的朋友可以參考下2016-01-01
Python虛擬環(huán)境的創(chuàng)建和包下載過(guò)程分析
這篇文章主要介紹了Python虛擬環(huán)境的創(chuàng)建和包下載,本文通過(guò)實(shí)例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
python繪制帶有誤差棒條形圖的實(shí)現(xiàn)
本文主要介紹了python繪制帶有誤差棒條形圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
python 實(shí)現(xiàn)一次性在文件中寫(xiě)入多行的方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)一次性在文件中寫(xiě)入多行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5 MDI(多文檔窗口)QMidArea詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5 MDI(多文檔窗口)QMidArea詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03
Python中json.load()與json.loads()方法有什么區(qū)別詳解
在讀取文件時(shí)解碼python的json格式,常用到j(luò)son.loads()與json.load(),下面這篇文章主要給大家介紹了關(guān)于Python中json.load()與json.loads()方法有什么區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-08-08
Python3+Selenium+Chrome實(shí)現(xiàn)自動(dòng)填寫(xiě)WPS表單
本文通過(guò)python3、第三方python庫(kù)Selenium和谷歌瀏覽器Chrome,完成WPS表單的自動(dòng)填寫(xiě),通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02

