程序在執(zhí)行過程中不可能一直一帆風(fēng)順膘滨,可能是由于程序員的疏忽出現(xiàn)程序設(shè)計(jì)問題或者是使用者沒有按照規(guī)范執(zhí)行程序胸哥,當(dāng)發(fā)生異常的時(shí)候程序會(huì)停止執(zhí)行并拋出異常材蹬,在控制臺(tái)自動(dòng)打印出異常信息」娑瑁或者通過異常捕獲機(jī)制捕獲異常讓程序繼續(xù)執(zhí)行下去睬塌,Python提供了try···except···else···finally···的錯(cuò)誤處理機(jī)制,else中的內(nèi)容是當(dāng)try成功執(zhí)行(無異常)時(shí)獎(jiǎng)勵(lì)執(zhí)行的歇万,而finally是無論如何都會(huì)執(zhí)行的揩晴,但這兩者都不是必要結(jié)構(gòu),該結(jié)構(gòu)可以嵌套構(gòu)建贪磺。
except后面沒有加異常類型信息的時(shí)候就是對(duì)任何異常都進(jìn)行捕獲并處理硫兰,而有時(shí)需要針對(duì)不同的異常執(zhí)行下一步操作,這時(shí)候可以設(shè)定異常類型并且設(shè)置多個(gè)except依次攔截寒锚。在Python中異常也是對(duì)象也存在有子父間關(guān)系劫映,當(dāng)異常拋出時(shí)需要有對(duì)應(yīng)的exception類型來捕獲违孝,否則會(huì)持續(xù)向上拋出到調(diào)用函數(shù),看看調(diào)用函數(shù)是否有相應(yīng)的exception來捕獲泳赋,到最后都沒有的話依舊會(huì)導(dǎo)致程序停止雌桑,在控制臺(tái)打印出信息。BaseException是所有異常類型的父類摹蘑,所以except不指定異常信息等價(jià)于指定BaseException類型筹燕,對(duì)所有的異常均可以捕獲轧飞。
def foo(s):
n = int(s)
try:
if n == 0:
raise ValueError('invalid value: %s' % s)
except KeyError:
print('KeyError!')
return 10 / n
def bar():
try:
foo('0')
except ValueError:
print('ValueError!')
bar()
logging模塊的exception方法可以打印出異常信息衅鹿。
import logging
def foo(s):
n = int(s)
try:
if n == 0:
raise ValueError('invalid value: %s' % s)
except KeyError:
print('KeyError!')
except BaseException as e:
print("終極攔截")
logging.exception(e)
print("繼續(xù)執(zhí)行")
return 10
def bar():
try:
foo('0')
except ValueError:
print('ValueError!')
bar()
結(jié)果為:
終極攔截
>ERROR:root:invalid value: 0
>Traceback (most recent call last):
File "<ipython-input-26-32c1733ed41b>", line 6, in foo
raise ValueError('invalid value: %s' % s)
ValueError: invalid value: 0
>繼續(xù)執(zhí)行