python異常(捕獲異常)
阿新 • • 發佈:2018-12-11
異常:
當Python檢測到一個錯誤時,直譯器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的"異常"
案例剖析
<1>捕獲異常 try...except...
看如下示例:
try:
print('-----test--1---')
open('123.txt','r')
print('-----test--2---')
except IOError:
pass
執行結果:
說明:
- 此程式看不到任何錯誤,因為用except 捕獲到了IOError異常,並添加了處理的方法
- pass 表示實現了相應的實現,但什麼也不做;如果把pass改為print語句,那麼就會輸出其他資訊
小總結:
- 把可能出現問題的程式碼,放在try中
- 把處理異常的程式碼,放在except中
<2> except捕獲多個異常
看如下示例:
try:
print num
except IOError:
print('產生錯誤了')
執行結果如下:
想一想:
上例程式,已經使用except來捕獲異常了,為什麼還會看到錯誤的資訊提示?
答:
except捕獲的錯誤型別是IOError,而此時程式產生的異常為 NameError ,所以except沒有生效
修改後的程式碼為:
try:
print num
except NameError:
print('產生錯誤了')
執行結果如下:
實際開發中,捕獲多個異常的方式,如下:
#coding=utf-8 try: print('-----test--1---') open('123.txt','r') # 如果123.txt檔案不存在,那麼會產生 IOError 異常 print('-----test--2---') print(num)# 如果num變數沒有定義,那麼會產生 NameError 異常 except (IOError,NameError): #如果想通過一次except捕獲到多個異常可以用一個元組的方式
注意:
- 當捕獲多個異常時,可以把要捕獲的異常的名字,放到except 後,並使用元組的方式僅進行儲存
<3>獲取異常的資訊描述
<4>捕獲所有異常
<5> else
咱們應該對else
並不陌生,在if中,它的作用是當條件不滿足時執行的實行;同樣在try...except...中也是如此,即如果沒有捕獲到異常,那麼就執行else中的事情
try:
num = 100
print num
except NameError as errorMsg:
print('產生錯誤了:%s'%errorMsg)
else:
print('沒有捕獲到異常,真高興')
執行結果如下:
<6> try...finally...
try...finally...語句用來表達這樣的情況:
在程式中,如果一個段程式碼必須要執行,即無論異常是否產生都要執行,那麼此時就需要使用finally。 比如檔案關閉,釋放鎖,把資料庫連線返還給連線池等
demo:
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
#如果在讀取檔案的過程中,產生了異常,那麼就會捕獲到
#比如 按下了 ctrl+c
pass
finally:
f.close()
print('關閉檔案')
except:
print("沒有這個檔案")
說明:
test.txt檔案中每一行資料列印,但是我有意在每列印一行之前用time.sleep方法暫停2秒鐘。這樣做的原因是讓程式執行得慢一些。在程式執行的時候,按Ctrl+c中斷(取消)程式。
我們可以觀察到KeyboardInterrupt異常被觸發,程式退出。但是在程式退出之前,finally從句仍然被執行,把檔案關閉。