之前在學習python的時候有整理過python異常處理的文章,不夠簡單也不夠完整,所以決定再整理一篇,算做補充。
python shell
>>> open('開啟乙個不存在的檔案abc.txtabc.txt
','r')
traceback (most recent call last):
file
"", line 1, in
ioerror: [errno 2] no such file or directory: '
abc.txt
'
檔案,當系統找不到
abc.txt
檔案時,就會丟擲給我們乙個ioerror型別的錯誤,no such file or directory:abc.txt
(沒有abc.txt
這樣的檔案或目錄)
try...except...
假如,我們已經知道這種型別的錯誤,那麼就可以通過乙個異常撲捉來撲捉這個錯誤。我們可以通過try...except
來接收這個錯誤。開啟檔案寫入:
try再來執行程式就會看不到任何錯誤,因為我們用except: open(
"abc.txt
",'r')
except
ioerror:
pass
接收了這個
ioerror
錯誤。pass
表示實現了相應的實現,但什麼也不做。
假如我不是開啟乙個檔案,而是輸出乙個沒有定義的變數呢?
try顯然,在上面的**中我並沒有對aa:
aaexcept
ioerror:
pass
賦值,執行結果:
traceback (most recent call last):我們已經用exceptfile
"/home/fnngj/py_se/tryy.py
", line 3, in
aanameerror: name 'aa
'isnot defined
接收錯誤了,為什麼錯誤還是還是丟擲來了。如果你細心會發現這一次的錯誤型別是nameerror ,而我接收型別是ioerror
,所以要想接收這個
的錯誤,那麼需要修改接收錯誤的型別為nameerror
雖然,我知道print
語句是可能會拋乙個nameerror 型別的錯誤,雖然接收了這個型別錯誤,但我不知道具體的錯誤提示資訊是什麼。那麼,我能不能把錯誤資訊列印出來呢?當然可以:
try我們在接收錯誤型別的後面定義乙個變數msg:
aaexcept
nameerror, msg:
print msg
用於接收具體錯誤資訊
, 然後將
msg接收的錯誤資訊列印。再來執行程式:
name 'aa'現在只列印了一行具體錯誤資訊。isnot defined
異常的丟擲機制:
1、如果在執行時發生異常,直譯器會查詢相應的處理語句(稱為handler).
2、要是在當前函式裡沒有找到的話,它會將異常傳遞給上層的呼叫函式,看看那裡能不能處理。
3、如果在最外層(全域性「main」
)還是沒有找到的話,直譯器就會退出,同時列印出
traceback
以便讓使用者找到錯誤產生的原因。
注意:雖然大多數錯誤會導致異常,但乙個異常不一定代表錯誤,有時候它們只是乙個警告,有時候它們可能是乙個終止訊號,比如退出迴圈等。
try...finally...
try...finally...子句用來表達這樣的情況:
我們不管線捕捉到的是什麼錯誤,無論錯誤是不是發生,這些**「必須」
執行,比如檔案關閉,釋放鎖,把資料庫連線返還給連線池等。
建立檔案poem.txt
tryf.py
import執行程式(time
try:
f = file('
poem.txt')
while true: #
our usual file-reading idiom
line =f.readline()
if len(line) ==0:
break
time.sleep(2)
line,
finally
: f.close()
'cleaning up...closed the file
'
在windows
命令提示符或
linux
終端下執行):
...$ python tryf.py程式讀poem.txt檔案中每一行資料列印,但是我有意在每列印一行之前用time.sleepabcefg
^ccleaning up...closed the file
traceback (most recent call last):
file
"tryy.py
", line 18, in
time.sleep(2)
keyboardinterrupt
方法暫停
2秒鐘。這樣做的原因是讓程式執行得慢一些。在程式執行的時候,按
ctrl-c中斷/
取消程式。
我們可以觀察到keyboardinterrupt
異常被觸發,程式退出。但是在程式退出之前,
finally
從句仍然被執行,把檔案關閉。
到目前為止,我們只討論了如何捕捉異常,那麼如何丟擲異常呢?
raise丟擲異常
使用raise
來丟擲乙個異常:
tryr.py
#程式要求使用者輸入乙個檔名,如果使用者輸入的檔名是hellocoding=utf-8
filename = raw_input('
please input file name:')
if filename=='
hello':
raise nameerror('
input file name error !
')
,那麼丟擲乙個
nameerror
的異常,使用者輸入hello 和nameerror異常之間沒有任何必然聯絡,我只是人為的通過raise
來這樣定義,我當然也可以定義稱
typeerror
,但我定義的異常型別必須是
python
提供的。
附錄:
常見的python異常型別
python異常處理 Python 異常處理
使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...
python異常舉例 Python異常處理
1.1異常問題舉例 例一 i input 請輸入數字 請輸入數字 0 print i print 5 int i traceback most recent call last file line 1,in zerodivisionerror division by zero 上述 的報錯是除零的錯...
python異常處理
當你的程式中出現異常情況時就需要異常處理。比如當你開啟乙個不存在的檔案時。當你的程式中有一些無效的語句時,python會提示你有錯誤存在。下面是乙個拼寫錯誤的例子,print寫成了print。python是大小寫敏感的,因此python將引發乙個錯誤 print hello world file l...