python 異常斷言

來源:互聯網
上載者:User

標籤:rup   dev   mwl   bin   cpm   tee   mha   api   wpc   

在實際的指令碼開發中,我們需要用到python 的異常處理來捕捉異常和拋異常,所以我們有需要學習和使用python 的異常處理。

程式碼範例:

>>> open(‘abc.txt‘,‘r‘)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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... 來接收這個錯誤。開啟檔案寫入:
try:
open("abc.txt",‘r‘)
except IOError:
pass
再來運行程式就會看不到任何錯誤,因為我們用except 接收了這個IOError 錯誤。pass 表示實現了相應的實現,但什麼也不做。


假如我不是開啟一個檔案,而是輸出一個沒有定義的變數呢?
try:
       print aa
except IOError:
pass
顯然,在上面的代碼中我並沒有對aa 賦值,運行結果:

Traceback (most recent call last):
File "/home/fnngj/py_se/tryy.py", line 3, in <module>
print aa
NameError: name ‘aa‘ is not defined

我們已經用except 接收錯誤了,為什麼錯誤還是還是拋出來了。如果你細心會發現這一次的錯誤類型是NameError ,而我接收類型是IOError ,所以要想接收這個print 的錯誤,那麼需要修改接收錯誤的類型為NameError


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

try:

     print aa

except  NameError,msg:

print  msg

我們在接收錯誤類型的後面定義一個變數msg 用於接收具體錯誤資訊, 然後將msg 接收的錯誤資訊列印。再來運行程式:
name ‘aa‘ is not defined
現在只有一行具體錯誤資訊。

異常的拋出機制:

異常的拋出機制:
1、如果在運行時發生異常,解譯器會尋找相應的處理語句(稱為handler).
2、要是在當前函數裡沒有找到的話,它會將異常傳遞給上層的調用函數,看看那裡能不能處理。
3、如果在最外層(全域“main”)還是沒有找到的話,解譯器就會退出,同時列印出traceback 以便讓使用者
找到錯誤產生的原因。
注意:雖然大多數錯誤會導致異常,但一個異常不一定代表錯誤,有時候它們只是一個警告,有時候它們可能是一個終止訊號,比如退出迴圈等。


try...finally...

 我們不管線捕捉到的是什麼錯誤,無論錯誤是不是發生,這些代碼“必須”運行,比如檔案關閉,釋放鎖,把資料庫連接返還給串連池等。
建立檔案poem.txt

tryf.py

try:
     f = file(‘poem.txt‘)
     while True:             # our usual file-reading idiom
            line = f.readline()
            if len(line) == 0:
                 break
            time.sleep(2)
            print line,
finally:
     f.close()
     print ‘Cleaning up...closed the file‘

運行程式(在windows 命令提示字元或linux 終端下運行):

...$ python tryf.py
abc
efg
^CCleaning up...closed the file
Traceback (most recent call last):
File "tryy.py", line 18, in <module>
time.sleep(2)
KeyboardInterrupt

 

程式讀poem.txt 檔案中每一行資料列印,但是我有意在每列印一行之前用time.sleep 方法暫停2秒鐘。這樣做的原因是讓程式運行得慢一些。在程式啟動並執行時候,按Ctrl-c 中斷/取消程式。

我們可以觀察到KeyboardInterrupt 異常被觸發,程式退出。但是在程式退出之前,finally 從句仍然被執行,把檔案關閉。

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

Raise 拋出異常


使用raise 來拋出一個異常:


tryr.py

#coding=utf-8
filename = raw_input(‘please input file name:‘)
if filename==‘hello‘:
      raise NameError(‘input file name error !‘)

程式要求使用者輸入一個檔案名稱,如果使用者輸入的檔案名稱是hello ,那麼拋出一個NameError 的異常,使用者輸入hello 和NameError 異常之間沒有任何必然聯絡,我只是人為的通過raise 來這樣定義,我當然也可以定義稱TypeError ,但我定義的異常類型必須是python 提供的。

 

 

python 異常斷言

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.