天天看點

小朋友學Python(19):異常

一、什麼是異常

異常即是一個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。

一般情況下,在Python無法正常處理程式時就會發生一個異常。

異常是Python對象,表示一個錯誤。

當Python腳本發生異常時我們需要捕獲處理它,否則程式會終止執行。

二、異常處理

捕捉異常可以使用try…except語句。

try…except語句用來檢測try語句塊中的錯誤,進而讓except語句捕獲異常資訊并處理。

如果你不想在異常發生時結束你的程式,隻需在try裡捕獲它。

文法:

以下為簡單的try….except…else的文法

try:
<語句>        #運作别的代碼
except <名字>:
<語句>        #如果在try部份引發了'name'異常
except <名字>,<資料>:
<語句>        #如果引發了'name'異常,獲得附加的資料
else:
<語句>        #如果沒有異常發生      

try的工作原理是,當開始一個try語句後,python就在目前程式的上下文中作标記,這樣當異常出現時就可以回到這裡,try子句先執行,接下來會發生什麼依賴于執行時是否出現異常。

如果當try後的語句執行時發生異常,python就跳回到try并執行第一個比對該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。

如果在try後的語句裡發生了異常,卻沒有比對的except子句,異常将被遞交到上層的try,或者到程式的最上層(這樣将結束程式,并列印預設的出錯資訊)。

如果在try子句執行時沒有發生異常,python将執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。

例1

try:
    fh = open("mytest", "w")
    fh.write("This is a file to test exception!")
except IOError:
    print "Error: No file found or read file error!"
else:
    print "Write cotent to file succeed!"
fh.close()      

運作結果:

This is a file to      

檢視mytest檔案中的内容:

This is a file to      

例2

将mytest檔案的寫權限去掉

chmod      

再次執行test.py,結果為

Error: 
Error: No file found or read file error!      

三、使用except而不帶任何異常類型

你可以不帶任何異常類型使用except

try:
    正常的操作
   ......................
except:
    發生異常,執行這塊代碼
   ......................
else:
如果沒有異常執行這塊代碼      

以上方式try…except語句捕獲所有發生的異常。但這不是一個很好的方式,我們不能通過該程式識别出具體的異常資訊。因為它捕獲所有的異常。

四、try…except…finally語句

finally 中的代碼無論是否發生異常都将被執行

例3:除0異常

try:
    1 / 0
except Exception as e:
    print "0 can not be divided!"
else:
    print "No exception!"
finally:
    print "Anyway, statement in finally block will be executed!"      

運作結果:

0 can not be divided!
Anyway, statement in finally block will be      

五、raise觸發異常

例4

#define function
def test_func( level ):
    if level < 1:
        raise Exception("Invalid level!", level)

try:
    #invoke function
    test_func(0)                
except "any":
    print 1
else:
    print 2
finally:
    print 3      

運作結果:

3
Traceback (most recent call last):
  File “test.py”, line 8, in <module>
test_func(0)
  File “test.py”, line 4, in test_func
raise Exception(“Invalid level!”, level)
Exception: (‘Invalid level!’,0)      

從運作結果可以看出,raise抛出異常後,except和else中的語句都沒有被列印出來,但是finally中的語句被列印出來了。

更多内容請關注微信公衆号