Python官方教程閱讀總結(jié)-錯(cuò)誤和異常

python中有兩類顯著的錯(cuò)誤:語法錯(cuò)誤和異常

1. 語法錯(cuò)誤

? ? 不符合python的錯(cuò)碼書寫規(guī)范引起的錯(cuò)誤,例如沒有加冒號,縮進(jìn)不正確,括號少了一邊等,如下例:

? ? 上例中,for語名后面沒冒號而引起語法錯(cuò)誤,在輸出的錯(cuò)誤信息中,先指出了錯(cuò)誤所在的行數(shù),然后箭頭指出了錯(cuò)誤的位置,最后報(bào)出了錯(cuò)誤的類型(SyntaxError)以及錯(cuò)誤的原因。

2. 異常

? ? 當(dāng)語法沒有問題的時(shí)候,在執(zhí)行語句的過程中檢測到的錯(cuò)誤叫異常。大多數(shù)情況下,異常能夠被程序處理,如下面的異常:

? ? ? ?上例中,語法沒有錯(cuò)誤,在執(zhí)行 5 / 0 的時(shí)候,發(fā)現(xiàn)除數(shù)是0,于是就拋出了異常。異常信息的最后一行包含了異常的類型(ZeroDivisionError)以及異常的具體原因(division by zero)。這些異常類型通常是python內(nèi)置的異常類的名字,用戶也可以自己定義異常。

3. 處理異常

? ? 異常發(fā)生后如果不處理,就會強(qiáng)制使程序中斷,如果不想因?yàn)楫惓6袛喑绦虻膱?zhí)行,就要處理異常。python中多用try ... except 語句來處理異常,如下面的例子:

? ? 在這個(gè)例子中,使用一個(gè)while的無限循環(huán),檢測用戶輸入的內(nèi)容,如果可以轉(zhuǎn)換成數(shù)字,就結(jié)束循環(huán),進(jìn)行下一步,如果不能轉(zhuǎn)換成數(shù)字,就處理異常,一直循環(huán),提示用戶輸入數(shù)字,可以看到檢測到異常后,程序就沒有終止運(yùn)行,而是在處理發(fā)生的異常

? ? 這里面,用關(guān)鍵字 try 來執(zhí)行可能發(fā)生異常的語句,如果檢測到異常,且異常類型與except后面的異常類型相符,就執(zhí)行except后面的語句來處理異常。如果檢測到的異常與except后面的異常類型不相符,該異常就會被傳到外部的try語句來處理,如果沒有找到相應(yīng)的處理語句,就會拋出unhandled exception

? ? 一個(gè)try語句后也可以跟多個(gè)except 來處理異常,以匹配可能發(fā)生的不同的異常類型。同時(shí),一個(gè)except語句后面也可以跟多個(gè)異常類型,如:

? ??except ( RuntimeError, TypeError, NameError ):

? ? ? ? ? ? print("Error happened")

? ? try ... except ... else 語句, 其中else語句是可選的,但必須跟在except語名的后面。作用是:當(dāng)try中的語句沒有拋出異常時(shí),一定會執(zhí)行的語句就放在else語句中

4. 拋出異常

? ? python中使用 raise 語句來拋出異常,用法如下:

? ??try:?

????????raise NameError ( 'Hi There' )

????except NameError:

????????print( ' An exception flew by! ' )

????????raise

? ? 該實(shí)例中,使用raise 拋出異常,同時(shí)用except處理拋出的異常,如果不打算處理該異常,就可以用 re-raise的方法來重新拋出(except 中再raise)

? ? raise 語句拋出異常時(shí),后面跟的要么是一個(gè)異常實(shí)例,要么是一個(gè)異常類,如果是一個(gè)異常類的話,就會調(diào)用該類的無參構(gòu)造函數(shù)來實(shí)例化。

5. 用戶自定義的異常

? ? 上面說到除了內(nèi)置的異常類外,用戶也可以自己定義異常,但自定義的異常要直接或間接地來繼承 Exception 這個(gè)基類(后面會講到類的繼承等,這部分出現(xiàn)得有點(diǎn)早),用戶自定義的類可以做其它任何類能做的事情,但通常盡量保持簡單,只構(gòu)建一些屬性用來提供異常信息輸出。如下面官方文檔中的例子:

6. 定義收尾操作

? ? 在異常處理的過程中,try語句的另一個(gè)可選語句是finally,無論異常是否拋出,是否處理,都要執(zhí)行的掃尾操作就用finally語句來執(zhí)行。如下:

7. 預(yù)先定義的掃尾操作

? ? 一些對象定義了標(biāo)準(zhǔn)的掃尾操作,當(dāng)這個(gè)對象不再需要時(shí),無論該對象的執(zhí)行是否成功,都會執(zhí)行這個(gè)預(yù)先標(biāo)準(zhǔn)掃尾操作。例如 with 語句就預(yù)先定義了掃尾操作,如下例:

在上例中,用 with 語句打開的文件對象 f 論如何都會進(jìn)行關(guān)閉操作,這是因?yàn)?with 已經(jīng)預(yù)先定義了關(guān)閉這一掃尾操作,這也是上一節(jié)中為什么提倡用 with語句 來進(jìn)行文件的打開操作。


這一小結(jié)結(jié)束,具體請參考官方文檔:https://docs.python.org/3/tutorial/errors.html

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

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

  • 一、簡介 Python最強(qiáng)大的結(jié)構(gòu)之一就是它的異常處理能力,所有的標(biāo)準(zhǔn)異常都使用類來實(shí)現(xiàn),都是基類Exceptio...
    隨風(fēng)化作雨閱讀 3,148評論 0 1
  • 一、錯(cuò)誤和異常 1.概念 兩種容易辨認(rèn)的錯(cuò)誤? 語法錯(cuò)誤:一些關(guān)于語法的錯(cuò)誤【縮進(jìn)】? 異常:代碼完全正確,但是,...
    hollow_02f9閱讀 1,286評論 0 0
  • python提供了兩個(gè)非常重要的功能來處理python程序在運(yùn)行中出現(xiàn)的異常和錯(cuò)誤。你可以使用該功能來調(diào)試pyth...
    _寧采臣閱讀 1,095評論 0 10
  • 《我的路》引言 一個(gè)偶然的機(jī)會我結(jié)識了王老師,看到了他的詩詞,了解了他的生活~他的坎坷的人生路。他被病魔折磨了幾十...
    金河灣a閱讀 551評論 2 8
  • 前言 相信做unity的同學(xué)或多或少都會有對數(shù)值變化進(jìn)行平滑的需求,比如攝像機(jī)的移動,物體顏色的漸變等等,我們不想...
    巨龍餓了閱讀 18,158評論 2 13

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