一、什麼是異常
異常即是一個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。
一般情況下,在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中的語句被列印出來了。
更多内容請關注微信公衆号