Python 中的 try-except 語句

??在 Python 中,使用異常來控制流程十分普遍,Python 的核心開發(fā)者也常常這么做。這種風(fēng)格也深植于語言源碼中,例如迭代器協(xié)議使用 StopIteration 異常作為循環(huán)終止信號(hào)。另外,在某些 “先判斷再執(zhí)行” 結(jié)構(gòu)中,try-except 風(fēng)格可以避免條件的不確定性。比如測(cè)試 os.path.exists(path) 的結(jié)果可能和你真正使用路徑的時(shí)候不同(有其他進(jìn)程在判定和執(zhí)行之間創(chuàng)建或者刪除了你檢查的路徑)。同樣, Queue.full() 的結(jié)果也可能是不過期的。在這種需要檢查和執(zhí)行同時(shí)進(jìn)行的情況下, try-exceptif-else 風(fēng)格的代碼更加可靠。
??在其他的一些語言中,“異常不是錯(cuò)誤” 的規(guī)則反應(yīng)在了標(biāo)準(zhǔn)庫的規(guī)范中,這種規(guī)則也部分考慮了語言的性能需要。Python 的規(guī)范有一些不同:大部分情況下,你必須使用異常來控制流程。另外,使用異常也不會(huì)降低被 try 包裹的語句的運(yùn)行速度,因?yàn)椴还苣阌袥]有使用異常語句,CPython 都會(huì)在每一步進(jìn)行異常檢查。換句話說,“異常是一些例外情況” 這一規(guī)則在某些其他語言中是有意義的,但在 Python 中沒有。
??除了用于避免if條件變化,異常也常用于把錯(cuò)誤處理移出循環(huán),對(duì)于解釋型語言來說這是很重要的優(yōu)化,不必自動(dòng)外提循環(huán)不變代碼。此外,異常可以使處理問題的代碼能遠(yuǎn)離問題出現(xiàn)的地方從而簡(jiǎn)化代碼。 例如,有頂級(jí)用戶界面代碼調(diào)用業(yè)務(wù)邏輯代碼,后者又調(diào)用低級(jí)例程。 低級(jí)例程中出現(xiàn)的異常(例如數(shù)據(jù)庫訪問中唯一鍵的重復(fù)記錄)只能在頂級(jí)代碼中處理(例如向用戶詢問與現(xiàn)有密鑰不沖突的新密鑰)。 對(duì)這種控制流使用異常允許中級(jí)例程完全忽略該問題,并且可以很好地與流控制的這一方面分離。(見這里以及這里)
??else 語句很有趣,當(dāng)沒有異常時(shí),他會(huì)優(yōu)于 finally 語句執(zhí)行,這是它的初始目的。如果沒有 else ,在 finally 之前運(yùn)行其他代碼的唯一選擇就是將代碼添加到 try 代碼塊的尾部,由于添加這些代碼亦可產(chǎn)生異常,這使得 except 難以區(qū)分哪些代碼的異常需要捕獲而哪些不需要。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 ||| 第二章 使用ArcPy編寫腳本 Python支持大部分在其他語言中出現(xiàn)的編程結(jié)構(gòu)。在本章內(nèi)容中,我們...
    muyan閱讀 90,784評(píng)論 10 55
  • 電池狀態(tài)欄。//方法一(代碼設(shè)置):現(xiàn)在ios7已經(jīng)更改為透明,并且不占用屏幕高度。其中隱藏及顯示的方法如下:在u...
    plantAtree_dAp閱讀 298評(píng)論 1 0
  • 她那時(shí)候生的極是好看。跟她一起玩的那一群孩子,男孩子總是特別喜歡她。在那個(gè)還不懂什么叫做愛情的時(shí)候,有...
    如果上帝不喜歡這個(gè)小孩閱讀 175評(píng)論 0 0
  • PS:有的朋友可能會(huì)掃描出現(xiàn)問題,如果報(bào)異?!癝ecurityException”同時(shí)讀者又確切的把相機(jī)權(quán)限加上去...
    Cloverss閱讀 1,885評(píng)論 5 4

友情鏈接更多精彩內(nèi)容