Exception Handling
大部分執行中的錯誤, Python 直譯器 (interpreter) 會以發起例外 (exception) 的方式來中斷程式的執行。實際上,很多情況下我們需要自行控制可能會產生例外的程式碼,因為例外並不全然是程式的邏輯錯誤,例如程式中打算開啟檔案,然而實際檔名並不存在,這種情況下,我們需要的是例外發生後的處理動作,而非中止程式的執行。
凡是可能會產生例外的程式碼, Python 利用 try-except 陳述 (try-except statement) 讓程式設計師自行處理例外。 try-except 為關鍵字 (keyword) 之一,專門用來例外處理 (exception handling) 的。
try-except表示式:
expect NameError: expect IndexError:
expect 特定例外:
在try suite中的程式碼會被Python嘗試執行,一旦產生例外,會交由except suite 中的程式碼來處理。
In[8]:
try:
... a = 0
... b.split() #發生例外
... b = 0 #運算不會被執行
...
except:
... c = 0 #跳過例外至except 區塊
...
In[9]:
a
Out[8]:
0
In[10]:
b
Traceback
(most recent call last):
File
"C:\Users\cash.chien\AppData\Local\Continuum\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py",
line 3066, in run_code
exec(code_obj, self.user_global_ns,
self.user_ns)
File
"<ipython-input-9-3b5d5c371295>", line 1, in <module>
b
NameError:
name 'b' is not defined
In[11]:
c
Out[10]:
0
try ... except 還支援 else 和 finally 敘述句以提供更有彈性的控制
若try區塊中並未引發任何例外,則else會在try 區塊執行完後被執行,反之則不執行
finally 區塊不論例外發生與否,捕捉與否,總是會在最後被執行
raise
使用raise敘述句可引發例外
引發例外時所帶有的參數(args)會在例外被印出時同時被輸出
範例:
try:
raise NameError
except
NameError:
print("something wrong")
print("after
exception....")
Out:
something wrong
after exception....
自定義例外
- 在python中一切皆物件, 例外也不例外
- 每個發生的例外都是物件, 而同一類型的例外屬於同一個類別
- 自定義例外的方法其實就是定義一個新的例外類別
- 簡單的例外定義可以藉由下述的類別定義
範例:
#-*-coding:UTF-8
-*-
# 自訂例外範例
# 錢包總金額為1000元,如果購買商品總金額超過1000
# 將會引發一個金額不足的例外
shoppingcart
= {'fruits':400,'shoes':700 }
class
insufficientError(Exception): pass
def
buy(items):
cash = 1000
total = 0
try:
for price in items.values():
total += price
if total > cash:
raise insufficientError
except insufficientError:
print('INSUFFICIENT FUND')
buy(shoppingcart)
Out:
INSUFFICIENT
FUND
沒有留言:
張貼留言