Python入門(十) 異常處理

    在咱們的程序開發過程當中,須要區分正常過程與異常(非正常)的狀況。爲了可以處理異常事件,c語言編程中要求使用條件語句進行判斷,尤爲是咱們每調用一個函數,都須要對其返回值進行檢查,這樣子就會致使咱們的代碼很大一部分都是對異常的處理,致使代碼比較難閱讀。在Python中,提供了異常對象來做爲解決方案。python

    1. exception objectc++

    Python用異常對象(exception object)來表示異常狀況。若是異常對象未被處理或捕捉,程序就會用所謂的回溯(Traceback)終止執行:編程

def div_func(a, b):
    return (a / b)

val = div_func(1, 0)
>>> 
Traceback (most recent call last):
  File "E:/code_practice/python_exercise/exception_demo.py", line 4, in <module>
    val = div_func(1, 0)
  File "E:/code_practice/python_exercise/exception_demo.py", line 2, in div_func
    return (a / b)
ZeroDivisionError: division by zero

    從上面的例子能夠看出,因爲除數爲0,致使ZeroDivisionError異常。咱們能夠經過對ZeroDivisionError的捕獲,避免程序的終止;編程語言

try:
    val = div_func(1, 0)
    print(val)
except ZeroDivisionError:
    print('division by zero')
    
>>>
division by zero

    2.常見的exception object函數

1)Exception: 全部異常的基類,能夠表示任意類型的異常spa

2)AttributeError: 特性引用或賦值失敗是引起code

3)IOError: 打開不存在的文件或者讀寫文件失敗時引起對象

4)IndexError: 使用序列中不存在的索引時引起索引

5)KeyError: 使用Dict中不存在的key時引起事件

6)NameError: 找不到變量時引起

7)SyntaxError: 代碼爲錯誤形式時引起

8)TypeError: 函數應用於錯誤類型的對象時引起

9)ValueError: 對象賦值爲不合適的值時引起

10)ZeroDivisionError: 除0操做時引起

    3. 異常的捕獲

    使用過面向對象的編程語言,如c++, Java等,都是經過try...catch來對異常進行捕獲的,那麼在Python中也是如此。大體的語法以下:

try:
    #statement
    ...
except exception1:
    #handle type of exception1
    ...
except exception2:
    #handle type of exception2
    ...
except:
    #handle any type of exception
    ...
else:
    #when no exception occures, excute here
    ...
finally:
    #whether exception occures or not, it will excute here
    ...

    若是在執行statement代碼的過程當中,接收到了異常,此時會終止statement的繼續執行,跳轉到異常的捕獲處理狀況,依次判斷每個except分支,直到有符合的except object,則會執行對應的異常處理分支,若是都沒有符合的分支,則會跳轉到執行finally去執行,而且將此異常繼續傳遞給調用者。若是statement代碼沒有發生異常,則會執行else分支的代碼,最後執行finally中的代碼。

    若是異常沒有被捕獲處理,則會一直向上層傳播,直至有代碼對其捕獲處理。若是直到最上層都沒有捕獲處理,則會打印Traceback信息,並終止程序的運行。

大體的處理流程以下:

try->異常->except->finally

try->無異常->else->finally

#未對引起的異常進行捕獲處理的狀況
list1 = ['a', 'b']
try:
    print(list1[3])
except KeyError:
    print('handle KeyError')

>>>
Traceback (most recent call last):
  File "E:/code_practice/python_exercise/exception_demo.py", line 13, in <module>
    print(list1[3])
IndexError: list index out of range

    上面引起的是IndexError異常,沒有匹配的異常類型,致使異常沒有被匹配到。

#使用finally語句
list1 = ['a', 'b']
try:
    print(list1[3])
except IndexError:
    print('index out of range')
except:
    print('catch exception')
finally:
    print('exceute finally statement')

>>>
index out of range
exceute finally statement

   執行流程: try-->except IndexError-->finally

    3.throw exception

    在Python中,經過raise來向上拋出一個exception

def change_list(list_arg):
    try:
        list_arg[len(list_arg)] = 'end'
    except IndexError:
        print('raise IndexError')
        raise IndexError
    else:
        print('no exception')
    finally:
        print('exit change_list')

change_list(list1)

>>>
Traceback (most recent call last):
  File "E:/code_practice/python_exercise/exception_demo.py", line 24, in change_list
    list_arg[len(list_arg)] = 'end'
IndexError: list assignment index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:/code_practice/python_exercise/exception_demo.py", line 33, in <module>
    change_list(list1)
  File "E:/code_practice/python_exercise/exception_demo.py", line 27, in change_list
    raise IndexError
IndexError
相關文章
相關標籤/搜索