給妹子講python S01E23初識異常處理

2021-09-11 23:31:35 字數 3823 閱讀 1898

1.異常的預設處理和主動捕獲

2.主動觸發異常和自定義異常

3.finally終止**塊的用法

【妹子問】從字面上來看,異常是程式執行時出現的錯誤吧。

沒錯,每當在執行時檢測到程式錯誤時,python就會引發異常。對待異常有兩種方法:一是可以在程式中捕捉和響應錯誤;或者忽略已發生的異常。

如果是忽略已發生的異常,python預設的異常處理行為將啟動:停止程式,列印出錯訊息。如果不想啟動這種預設行為,就要寫try語句來捕捉異常並從異常中恢復,當程式執行檢測到錯誤時,python會跳到try處理器,而程式在try之後會重新繼續執行。

首先來看看python自帶的預設異常處理器

def fetcher(obj, index):

return obj[index]

x = 'spam'

print(fetcher(x,3))

print(fetcher(x,9))

mtraceback (most recent call

last):

file

"e:/12homework/12homework.py", line 7, in

print(fetcher(x,9))

file

"e:/12homework/12homework.py", line 2, in fetcher

return obj[index]

indexerror: string

index

outof

range

複製**

從這個例子可以看到,我們試圖對字串末尾以後的位置做索引運算,當函式嘗試執行obj[9]時,就會觸發異常。python會替序列檢測到超出邊界的索引運算,並通過丟擲(觸發)內建的indexerror異常進行報告。

在這個例子中,我們的**沒有刻意去捕捉這個異常,所以他會一直向上返回到程式頂層,並啟用預設的異常處理器:就是列印標準出錯資訊,即異常發生時啟用的程式行和函式清單。

那麼,如果我們想自己去捕獲異常呢?

因為在有些情況下,這並不是我們想要的。例如,伺服器程式一般需要在內部發生錯誤時依然保持繼續工作。如果你不想要預設的異常行為,就需要把呼叫封裝在try語句內,自行捕捉異常。

def

fetcher

(obj, index):

return obj[index]

x = 'spam'

try:

fetcher(x,9)

except indexerror:

print('got exception')

got exception

複製**

現在,當try**塊內程式執行觸發異常時,python會自動跳至處理器(即except分句下面的**塊)去執行。

def

fetcher

(obj, index):

return obj[index]

x = 'spam'

try:

fetcher(x,9)

except indexerror:

print('got exception')

print('continue...')

got exception

continue...

複製**

在這個例子中,我們在異常捕捉和處理後,程式在捕捉了整個try語句後繼續執行;這就是我們之所以得到continue訊息的原因。我們沒有看見標準出錯資訊,而程式也將正常執行下去。

除了python自身會產生異常以外,我們在程式中也可以主動引發異常。想要手動觸發異常,可以直接執行raise語句。使用者通過raise觸發的異常的捕捉方式和python程式自身引發的異常一樣:

try:

raise indexerror

except indexerror:

print('got exception')

got exception

複製**

如果沒有去捕捉到異常,使用者定義的異常就會向上傳遞,直到頂層預設的異常處理器,並通過標準出錯資訊終止該程式,看看,是不是感覺很熟悉。

raise indexerror

traceback (most recent call

last):

file

"e:/12homework/12homework.py", line 1, in

raise indexerror

indexerror

複製**

我們還可以自定義異常

剛才我們利用raise語句觸發了python內建作用域中定義的乙個內建異常。其實我們也可以自己定義乙個新的異常,這裡可能需要一點物件導向的知識,所以我們只需要了解即可:自定義的異常能夠通過類來編寫,它繼承自乙個內建的異常類:通常這個類的名稱叫做exception

class

bad(exception):

pass

defdoomed

():raise bad()

try:

doomed()

except bad:

print('got bad')

got bad

複製**

最後說說終止行為finally**塊

try語句可以包含finally**塊。可以定義一定會在最後執行時的收尾行為。這裡的「一定「指的是無論try**塊中是否發生了異常都會執行。

try:

raise indexerror

finally:

print('in finally')

print('after finally')

infinally

traceback (most recent call last):

file "e:/12homework/12homework.py", line 2, in

raise indexerror

indexerror

try:

print('ok')

finally:

print('in finally')

print('after finally')

okin

finally

after finally

複製**

可以看出,上述try/finally語句組合,無論try**塊是否發生異常,程式都將會執行finally**塊中的語句。但是當有異常發生時,python會跳過去執行finally中的行為,執行完finally中的語句後,再將try中的異常傳遞給頂層的預設處理器,因此finally後面的語句就不會執行了。但是如果try中的**不觸發異常,則finally後面的**塊就會正常的繼續執行。

我們總結一下:

在實際應用中,try/except的組合可用於捕捉異常並從中恢復,而try/finally的組合則很方便,可以確保無論try**塊內的**是否發生了異常,終止行為都一定會執行。

乙個例子是:比如無論是否出現異常,無論異常是否**獲,都一定會確保關閉檔案。

最終我們是可以把try/except/finally三者連用的,try內為主體功能**,except用來捕獲異常,而無論異常是否出現,是否被except捕獲,都將執行finally內的語句。

給妹子講python S01E23初識異常處理

1.異常的預設處理和主動捕獲 2.主動觸發異常和自定義異常 3.finally終止 塊的用法 妹子問 從字面上來看,異常是程式執行時出現的錯誤吧。沒錯,每當在執行時檢測到程式錯誤時,python就會引發異常。對待異常有兩種方法 一是可以在程式中捕捉和響應錯誤 或者忽略已發生的異常。如果是忽略已發生的...

給妹子講python S01E02學會用字典

妹子說 上次講了列表,今天接著講講字典吧。首先我要說,字典這個容器型別真的非常好用,也非常重要。字典和列表完全不同,字典裡的物件是無序的,他是通過一對對的鍵和值來反映一種對映關係。字典裡,每個鍵都是唯一的,我們可以通過鍵來訪問對應的值,而不能像列表那樣通過位置來索引。首先來看看怎樣用最簡單的方法生成...

給妹子講python S01E09檔案操作小意思

前面幾集裡,我們詳細介紹了python字串以及編譯碼的有關內容,這些內容實質上也是檔案操作的基礎。今天這一集,我們就正好來說說檔案操作。先預熱一下,看乙個利用open函式開啟檔案的簡單例子 myfile open myfile.txt w myfile open myfile.txt r 妹子說 檔...