2016年5月31日 星期二

Python_Note09

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







沒有留言:

張貼留言