1、try - except
作用: 捕獲程序在執(zhí)行時(shí)遇到的異常情況,即一些報(bào)錯(cuò)。什么啥玩意兒沒定義啊,符號(hào)又錯(cuò)了啊之類的你懂得。
意義: 因?yàn)槌绦蛟诎l(fā)現(xiàn)某個(gè)錯(cuò)誤時(shí),往往會(huì)中斷不再向下執(zhí)行,如下例子說明問題:
很明顯,我們并沒有定義b, 就將它賦值給a, 現(xiàn)在我們運(yùn)行如下:
不出所料提示NameError, 發(fā)現(xiàn)錯(cuò)誤就報(bào)錯(cuò),不再執(zhí)行下面的程序。
現(xiàn)在我們用try/except寫一下:
打?。?/p>
我們從這個(gè)例子可以試著去推測(cè)這段代碼的執(zhí)行過程:
(1)先執(zhí)行try代碼塊, 發(fā)現(xiàn)了錯(cuò)誤。
(2)執(zhí)行except代碼塊。
(3)程序向下執(zhí)行。
可能有疑問try block發(fā)現(xiàn)異常前后正常的的部分會(huì)被執(zhí)行嗎,可以測(cè)試一下:
打?。?/p>
結(jié)論:
(1)先執(zhí)行try block, 直到發(fā)現(xiàn)了錯(cuò)誤,不再執(zhí)行異常之后的代碼。
(2)執(zhí)行except block.
(3)向下繼續(xù)。
現(xiàn)在已經(jīng)對(duì)try/excepy有了感性的了解,接下來拓展它的用法:
簡單來說,在try/except語句中,可以用多個(gè)except.
例子:
這里使用了兩個(gè)except, 可以發(fā)現(xiàn)except 后面跟了SyntaxError, NameError, 這個(gè)我們經(jīng)常見過的兩個(gè)系統(tǒng)報(bào)錯(cuò),當(dāng)然這里可以改成任何系統(tǒng)錯(cuò)誤(參見python標(biāo)準(zhǔn)異常)。執(zhí)行:
可見,當(dāng)try代碼塊執(zhí)行出現(xiàn)異常,在except中匹配到了NameError的異常,則執(zhí)行了對(duì)應(yīng)except的語句。
新的疑問,若所有except都沒有匹配呢,測(cè)試如下:
我們將NameErro改成了SystemExit,打印:
發(fā)現(xiàn)又回到了開始,說明這樣的try/except等于是廢的。。。
所以避免沒有匹配到異常,又中斷程序,將代碼修改如下:
即又加了一條except, 這條except后面沒有加系統(tǒng)錯(cuò)誤,打?。?/p>
OK,get it.
2、try-except-else
舉個(gè)例子:
打?。?/p>
可見,有異常時(shí),else block時(shí)不執(zhí)行的。
那,無異常時(shí):
打印:
可見,無異常時(shí)else block執(zhí)行。
至此可以寫出try/except/else的格式
--------------------------------------------------------------------------------
try:
try block
except ERROR1:
except ERROR1 block
except ERRPR2:
except ERROR2 block
......
except:
except block
else:
else block
-----------------------------------------------------------------------------
當(dāng)然, 這些測(cè)試只是看到語句的功能,具體的實(shí)現(xiàn)內(nèi)部原理再說吧, 一開始看那些得把人搞暈。
3、try-finally
作用: 無論try語句是否有異常,最后都要執(zhí)行的代碼。
例子:
錯(cuò)是有的,先執(zhí)行完finally block, 然后回到try block報(bào)錯(cuò)。
當(dāng)然 try, except, else, finally是可以全部組合在一起用的。
PS:實(shí)際上可以自定義異常,這個(gè)需要用到類的知識(shí),以后再說。
聯(lián)系客服