給妹子講python-S01E23初識異常
【妹子問】從字面上來看,異常是程式執行時出現的錯誤吧。
沒錯,每當在執行時檢測到程式錯誤時,python就會引發異常。對待異常有兩種方法:一是可以在程式中捕捉和響應錯誤;或者忽略已發生的異常。
如果是忽略已發生的異常,python預設的異常處理行為將啟動:停止程式,列印出錯訊息。如果不想啟動這種預設行為,就要寫try語句來捕捉異常並從異常中恢復,當程式執行檢測到錯誤時,python會跳到try處理器,而程式在try之後會重新繼續執行。
首先來看看python自帶的預設異常處理器
從這個例子可以看到,我們試圖對字串末尾以後的位置做索引運算,當函式嘗試執行obj[9]時,就會觸發異常。Python會替序列檢測到超出邊界的索引運算,並通過丟擲(觸發)內建的IndexError異常進行報告。
在這個例子中,我們的程式碼沒有刻意去捕捉這個異常,所以他會一直向上返回到程式頂層,並啟用預設的異常處理器:就是列印標準出錯資訊,即異常發生時啟用的程式行和函式清單。
那麼,如果我們想自己去捕獲異常呢?
因為在有些情況下,這並不是我們想要的。例如,伺服器程式一般需要在內部發生錯誤時依然保持繼續工作。如果你不想要預設的異常行為,就需要把呼叫封裝在try語句內,自行捕捉異常。
現在,當try程式碼塊內程式執行觸發異常時,python會自動跳至處理器(即except分句下面的程式碼塊)去執行。
在這個例子中,我們在異常捕捉和處理後,程式在捕捉了整個try語句後繼續執行;這就是我們之所以得到continue訊息的原因。我們沒有看見標準出錯資訊,而程式也將正常執行下去。
除了python自身會產生異常以外,我們在程式中也可以主動引發異常。想要手動觸發異常,可以直接執行raise語句。使用者通過raise觸發的異常的捕捉方式和python程式自身引發的異常一樣:
如果沒有去捕捉到異常,使用者定義的異常就會向上傳遞,直到頂層預設的異常處理器,並通過標準出錯資訊終止該程式,看看,是不是感覺很熟悉。
我們還可以自定義異常
剛才我們利用raise語句觸發了python內建作用域中定義的一個內建異常。其實我們也可以自己定義一個新的異常,這裡可能需要一點物件導向的知識,所以我們只需要瞭解即可:自定義的異常能夠通過類來編寫,它繼承自一個內建的異常類:通常這個類的名稱叫做Exception
最後說說終止行為finally程式碼塊
try語句可以包含finally程式碼塊。可以定義一定會在最後執行時的收尾行為。這裡的“一定“指的是無論try程式碼塊中是否發生了異常都會執行。
可以看出,上述try/finally語句組合,無論try程式碼塊是否發生異常,程式都將會執行finally程式碼塊中的語句。但是當有異常發生時,python會跳過去執行finally中的行為,執行完finally中的語句後,再將try中的異常傳遞給頂層的預設處理器,因此finally後面的語句就不會執行了。但是如果try中的程式碼不觸發異常,則finally後面的程式碼塊就會正常的繼續執行。
我們總結一下:
在實際應用中,try/except的組合可用於捕捉異常並從中恢復,而try/finally的組合則很方便,可以確保無論try程式碼塊內的程式碼是否發生了異常,終止行為都一定會執行。
一個例子是:比如無論是否出現異常,無論異常是否被捕獲,都一定會確保關閉檔案。
最終我們是可以把try/except/finally三者連用的,try內為主體功能程式碼,except用來捕獲異常,而無論異常是否出現,是否被except捕獲,都將執行finally內的語句。
原文釋出時間為:2018-09-18
本文作者:給妹子講python
本文來自雲棲社群合作伙伴“Python愛好者社群”,瞭解相關資訊可以關注“Python愛好者社群”。
相關文章
- 給妹子講python-S01E23初識異常處理Python
- 給妹子講python-S01E24深入解析異常處理方式Python
- 給妹子講python-S01E12迴圈迭代初體驗Python
- 給妹子講python-S01E03元組的使用Python
- 講講我與Linux的初識Linux
- 給妹子講python-S01E09檔案操作小意思Python
- 給妹子講python-S01E09 python檔案操作小意思Python
- 給妹子講python-S01E15詳解python迭代環境Python
- 給隔壁的妹子講『一個SQL語句是如何執行的?』SQL
- 知識點講解七:Python中的異常處理機制Python
- 給妹子講python-S01E22詳解神奇的裝飾器Python
- 給妹子講python-S01E17談談函式的基本特徵Python函式特徵
- 給妹子講python-S01E01python容器的使用技巧之列表Python
- 學習使用mybatis框架初遇異常MyBatis框架
- 初學Solidity(六):Solidity異常處理Solid
- 給妹子講python-S01E05字串的基本用法詳解Python字串
- 給妹子講python-S01E06字串使用方法進階Python字串
- Java基礎知識——異常Java
- Java常見知識點彙總(⑨)——異常Java
- 給妹子講python-S01E11賦值與物件拷貝機制分析Python賦值物件
- 給妹子講python-S01E08理清python字元編碼的使用方法Python字元
- 給妹子講python-S01E20函式引數的傳遞與修改Python函式
- 安全通道異常識別系統
- 給妹子講python-S01E13掌握迴圈迭代的高階技巧Python
- 給妹子講python-S01E21函式引數的匹配與解包詳解Python函式
- Python基礎之錯誤和異常講解Python
- c++ 中vector 常見用法(給初學者)C++
- 給妹子講python-S01E19解析Python內嵌作用域與函式閉包Python函式
- 給公司妹子講了好久,頭都大了,一個SQL語句是如何執行的?SQL
- 初識卷積神經網路第一講!卷積神經網路
- 異常和異常呼叫鏈
- 異常篇——異常記錄
- 異常篇——異常處理
- 異常處理及其相關知識點
- 初階技能:Android 應用異常如何豐富線索Android
- 異常-異常的注意事項
- Java 異常(二) 自定義異常Java
- 異常-編譯期異常和執行期異常的區別編譯