python 異常學習2

2021-09-20 20:19:07 字數 3206 閱讀 1637

之前在學習python的時候有整理過python異常處理的文章,不夠簡單也不夠完整,所以決定再整理一篇,算做補充。

python shell

>>> open('abc.txt','r')

traceback (most recent call last):

file "", line 1, in ioerror: [errno 2] no such file or directory: 'abc.txt'

開啟乙個不存在的檔案abc.txt 

檔案,當系統找不到

abc.txt 

檔案時,就會丟擲給我們乙個ioerror型別的錯誤,no such file or directory:abc.txt 

(沒有abc.txt

這樣的檔案或目錄)

try...except...

假如,我們已經知道這種型別的錯誤,那麼就可以通過乙個異常撲捉來撲捉這個錯誤。我們可以通過try...except 

來接收這個錯誤。開啟檔案寫入:

try:

open("abc.txt",'r')except ioerror:    pass

再來執行程式就會看不到任何錯誤,因為我們用except 

接收了這個

ioerror

錯誤。pass 

表示實現了相應的實現,但什麼也不做。

假如我不是開啟乙個檔案,而是輸出乙個沒有定義的變數呢?

try:    print  aaexcept ioerror:    pass
顯然,在上面的**中我並沒有對aa 

賦值,執行結果:

traceback (most recent call last):

file "/home/fnngj/py_se/tryy.py", line 3, in print  aa

nameerror: name 'aa' is not defined

我們已經用except 

接收錯誤了,為什麼錯誤還是還是丟擲來了。如果你細心會發現這一次的錯誤型別是nameerror ,而我接收型別是ioerror 

,所以要想接收這個

print

的錯誤,那麼需要修改接收錯誤的型別為nameerror

雖然,我知道print 

語句是可能會拋乙個nameerror 型別的錯誤,雖然接收了這個型別錯誤,但我不知道具體的錯誤提示資訊是什麼。那麼,我能不能把錯誤資訊列印出來呢?當然可以:

try:    print  aaexcept  nameerror, msg:    print  msg
我們在接收錯誤型別的後面定義乙個變數msg

用於接收具體錯誤資訊

, 然後將

msg接收的錯誤資訊列印。再來執行程式:

name 'aa' is not defined
現在只列印了一行具體錯誤資訊。

異常的丟擲機制:

1、如果在執行時發生異常,直譯器會查詢相應的處理語句(稱為handler).

2、要是在當前函式裡沒有找到的話,它會將異常傳遞給上層的呼叫函式,看看那裡能不能處理。

3、如果在最外層(全域性「main」

)還是沒有找到的話,直譯器就會退出,同時列印出

traceback

以便讓使用者找到錯誤產生的原因。

注意:雖然大多數錯誤會導致異常,但乙個異常不一定代表錯誤,有時候它們只是乙個警告,有時候它們可能是乙個終止訊號,比如退出迴圈等。

try...finally...

try...finally...子句用來表達這樣的情況:

我們不管線捕捉到的是什麼錯誤,無論錯誤是不是發生,這些**「必須」

執行,比如檔案關閉,釋放鎖,把資料庫連線返還給連線池等。

建立檔案poem.txt

執行程式(

在windows

命令提示符或

linux

終端下執行):

...$ python tryf.py 

abcefg^ccleaning up...closed the file

traceback (most recent call last):

file "tryy.py", line 18, in time.sleep(2)

keyboardinterrupt

程式讀poem.txt檔案中每一行資料列印,但是我有意在每列印一行之前用time.sleep

方法暫停

2秒鐘。這樣做的原因是讓程式執行得慢一些。在程式執行的時候,按

ctrl-c中斷/

取消程式。

我們可以觀察到keyboardinterrupt

異常被觸發,程式退出。但是在程式退出之前,

finally

從句仍然被執行,把檔案關閉。

到目前為止,我們只討論了如何捕捉異常,那麼如何丟擲異常呢?

raise丟擲異常

使用raise

來丟擲乙個異常:

tryr.py

#coding=utf-8filename = raw_input('please input file name:')if filename=='hello':    raise nameerror('input file name error !')
程式要求使用者輸入乙個檔名,如果使用者輸入的檔名是hello 

,那麼丟擲乙個

nameerror

的異常,使用者輸入hello 和nameerror異常之間沒有任何必然聯絡,我只是人為的通過raise

來這樣定義,我當然也可以定義稱

typeerror 

,但我定義的異常型別必須是

python

提供的。

附錄:

常見的python異常型別

python學習筆記(2)異常處理

有時候我們不確定寫的 是否正確。不確定是否會出現這樣那樣的錯誤,這樣我們就可以用try進行測試當然也可以用debug。這裡讓我們看一下try。如果你已經預料到了錯誤型別,你就可以用這種形式,比如你已經能夠知道了可能發生的錯誤是檔案不存在 try 出現乙個異常以後不會檢查其他的 f open sjsk...

python基礎學習 類2異常處理

異常處理1 try print number except nameerror print 捕獲到異常後做什麼.異常處理2出現多種不同異常 try print number open 111.txt except nameerror,filenotfounderror 用元組包括異常狀態 print...

Python學習 異常

異常可以描述為 它是因為程式出現了錯誤而在正常控制流以外採取的行為。這個行為分為兩個階段 首先是引起異常發生錯誤,然後是採取措施處理階段。開發人員在編寫程式時,難免會遇到錯誤。開發人員在編寫程式時需要分析這些可能會造成異常的情況,從而保證程式流暢且穩定執行,而在這種情況下異常捕獲與處理就成為避免程式...