第十次課

python異常處理

異常

通常狀況下在python沒法正常處理程序時就會發生一個異常。
異常是python對象,表示一個錯誤。當python程序發生錯誤時須要捕獲處理,不然程序會終止執行。html

異常處理

捕獲異常可使用try/except語句。

該語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。python

  • 語法規則json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try:
    <語句>        #運行別的代碼
    except <名字>:
    <語句>        #若是在try部份引起了'name'異常
    except <名字>,<數據>:
    <語句>        #若是引起了'name'異常,得到附加的數據
    else:
    <語句>        #若是沒有異常發生
    finally:
    <語句>        #無論如何,最後必定執行的代碼
  • 處理流程
    當開始一個try語句後,python會在當前程序的上下文中進行標記,這樣當異常出現時就能夠回到這裏,try子句先執行,接下來發生什麼依賴於執行時是否出現異常。後端

  1. 當try後面的語句執行出現異常,python就會調回try並執行第一個匹配該異常的except子句,異常處理完成,而後控制流經過整個try語句。
  2. 當try後面的語句執行出現異常,卻沒有匹配的except子句,異常將會被遞交到上層的try,或者到程序的最上層(也就是結束程序,並打印出缺省的出錯信息)。
  3. 當try子句執行沒有異常,python將執行else後面的語句,而後控制流經過整個try語句。

    實例

  • 有異常出現被捕獲的狀況
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try:
        print("開始計算")
        result = 2/0
        print("計算結果爲:{0}".format(result))
    except Exception as e:
        print("除數不能爲0")
    else:
        print("無異常出現")
    finally:
        print("done")

輸出結果前後端分離

1
2
3
開始計算
除數不能爲0
done

 

根據輸出結果能夠看到,有異常出現的時候,先執行try語句,遇到異常則中止執行下面的語句(print("計算結果爲:{0}".format(result))未執行),跳轉至錯誤處理代碼,也就是except語句塊,執行完except後執行finally語句塊。不執行else語句塊。函數

  • 無異常出現狀況
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try:
        print("開始計算")
        result = 2/1
        print("計算結果爲:{0}".format(result))
    except Exception as e:
        print("除數不能爲0")
    else:
        print("無異常出現")
    finally:
        print("done")

輸出結果spa

1
2
3
4
開始計算
計算結果爲:2.0
無異常出現
done

 

根據輸出結果能夠看到,無異常出現的時候前後執行了tryelsefinally語句塊,未執行except語句塊。
在異常處理時elsefinally語句塊能夠沒有。code

  • raise拋出錯誤
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try:
        print("開始計算")
        result = 2/0
        print("計算結果爲:{0}".format(result))
    except Exception as e:
        print("除數不能爲0")
        raise e    #添加raise語句拋出錯誤
    else:
        print("無異常出現")
    finally:
        print("done")

輸出結果orm

1
2
3
4
5
6
7
開始計算
除數不能爲0
done
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
  File "<stdin>", line 3, in <module>
ZeroDivisionError: division by zero

 

經過添加raise拋出錯誤,咱們能夠看到錯誤類型爲ZeroDivisionError
在python中內置了不少的錯誤類型,咱們能夠經過針對不一樣的錯誤類型,可使用不一樣的except語句處理。htm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
try:
    print("開始計算")
    result = 2/int('a')
    print("計算結果爲:{0}".format(result))
except ZeroDivisionError as e:
    print("除數不能爲0")
    raise e
except ValueError as e:
    print("ValueError")
    raise e
else:
    print("無異常出現")
finally:
    print("done")

 

輸出結果

1
2
3
4
5
6
7
開始計算
ValueError
done
Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
  File "<stdin>", line 3, in <module>
ValueError: invalid literal for int() with base 10: 'a'

 

此時執行try語句塊時,int()函數拋出ValueError異常,因此執行了第二個except捕獲對應異常信息。
前面咱們在except中直接使用Exception,因爲大部分的錯誤類型都是繼承自該類型,因此可直接捕獲其子類。
python中全部的錯誤都是從BaseException類派生的,點擊查看常見的錯誤類型和繼承關係

異常信息規範輸出

在常見的先後端分離開發環境中,對於異常信息一般都是按照約定格式,返回json字符串,從而將異常信息記錄下來。
下面是一個示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import json

def log():
    result = {}
    try:
        print(2/0)
    except Exception as e:
        result["msg"] = "Division can not be 0"
        result["code"] = 250
        result["data"] = [{"a": 1}, {"b": 2}]
    finally:
        return json.dumps(result)    #字典轉換爲json串

if __name__ == '__main__':
    print(log())

 

輸出結果

1
{"msg": "Division can not be 0", "code": 250, "data": [{"a": 1}, {"b": 2}]}
相關文章
相關標籤/搜索