1. 程式人生 > >Python基礎(15):python中的異常處理機制

Python基礎(15):python中的異常處理機制

異常:程式執行過程中由外部問題(硬體錯誤,輸入錯誤)引起的異常事件。

捕獲異常

語法:

try:
    <語句>        
except <名字>:#異常1名字
    <語句>         #發生異常後執行的語句
else:

    <語句>        #沒有發生異常時執行的語句
finally:
    <語句>        #無論是否發生異常,結束時執行的語句

try的工作原理是,當開始一個try語句後,python就在當前程式的上下文中作標記,這樣當異常出現時就可以回到這裡,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
如果在try後的語句裡發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程式的最上層(這樣將結束程式,並列印預設的出錯資訊)。

如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。

示例:

開啟一個不存在的檔案,會報fileNotFoundError

用try語句捕獲這個異常,

else語句是在沒有異常的情況下執行的

拓展:

FileNotFoundError本質是一個異常類。

所有的異常,本質都是一個類。

異常類的樹形表如下:

解讀一下就是,FileNotFoundError的父類是OSError,OSError的父類是Exception類(大多數異常類的父類都是Exception),而終極boss是BaseException類(再往上就是Object類了)

明白這一點的意義有兩個:

第一:當你想捕獲一個異常,又不確定會遇到什麼異常的時候,可以直接except Exception,因為按照類的繼承原則,這條語句可以接收所有以它為父類的異常。

第二:你可以自己寫一個異常類了。

 

定製異常瞭解一下~

定義一個類,繼承Exception,它就成了異常類。

呼叫過程給了一個簡單的示範,當檔案不存在時,丟擲TestException異常,然後在下面捕獲,進行相應操作就可以。

丟擲異常

在進行上述操作後,有的同學會發現一個哲學性的問題:異常,從哪裡來的?

比如,FileNotFoundError,是在開啟檔案時,如果找不到,就會出現的異常。

那麼我們去看一下open方法的原始碼:

謎底揭曉:是方法在定義的時候,將可能出現的異常,丟擲了

所以我們才能在用這個函式時,捕獲他丟擲的異常。

那麼接下來學習,如何丟擲異常。

關鍵字:raise

def test1(n):                                   #定義函式test1
    n=int(n)
    if n==0:
        raise ValueError('invalid value %s'%n) #丟擲一個valueerror異常
    return 10/n
def test2():
    try:
        test1(0)                                #執行test1函式
    except Exception as e :                     #捕獲異常
        print(e)                                #列印記錄
        raise                                   #將異常丟擲,可以定義其他函式處理異常,此處不做處理