異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。
一般情況下,在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語句。
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
將mytest文件的寫權限去掉
chmod
再次執行test.py,結果為
Error:
Error: No file found or read file error!
你可以不帶任何異常類型使用except
try:
正常的操作
......................
except:
發生異常,執行這塊代碼
......................
else:
如果沒有異常執行這塊代碼
以上方式try…except語句捕獲所有發生的異常。但這不是一個很好的方式,我們不能通過該程序識別出具體的異常信息。因為它捕獲所有的異常。
finally 中的代碼無論是否發生異常都將被執行
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
#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中的語句被打印出來了。
更多內容請關注微信公眾號