第十次课
2019獨角獸企業重金招聘Python工程師標準>>>
python異常處理
異常
一般情況下在python無法正常處理程序時就會發生一個異常。
異常是python對象,表示一個錯誤。當python程序發生錯誤時需要捕獲處理,否則程序會終止執行。
異常處理
捕獲異常可以使用try/except語句。
該語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息并處理。
-
語法規則
1 2 3 4 5 6 7 8 9 10 try: <語句> #運行別的代碼 except <名字>: <語句> #如果在try部份引發了'name'異常 except <名字>,<數據>: <語句> #如果引發了'name'異常,獲得附加的數據 else: <語句> #如果沒有異常發生 finally: <語句> #不管如何,最后一定執行的代碼 -
處理流程
當開始一個try語句后,python會在當前程序的上下文中進行標記,這樣當異常出現時就可以回到這里,try子句先執行,接下來發生什么依賴于執行時是否出現異常。
實例
- 有異常出現被捕獲的情況
1 2 3 4 5 6 7 8 9 10 try:print("開始計算")result = 2/0print("計算結果為:{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/1print("計算結果為:{0}".format(result)) except Exception as e:print("除數不能為0") else:print("無異常出現") finally:print("done")
輸出結果
| 1 2 3 4 | 開始計算 計算結果為:2.0 無異常出現 done |
?
根據輸出結果可以看到,無異常出現的時候先后執行了try、else和finally語句塊,未執行except語句塊。
在異常處理時else和finally語句塊可以沒有。
- raise拋出錯誤
1 2 3 4 5 6 7 8 9 10 11 try:print("開始計算")result = 2/0print("計算結果為:{0}".format(result)) except Exception as e:print("除數不能為0")raise e #添加raise語句拋出錯誤 else:print("無異常出現") finally:print("done")
輸出結果
| 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語句處理。
| 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 jsondef log():result = {}try:print(2/0)except Exception as e:result["msg"] = "Division can not be 0"result["code"] = 250result["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}]} |
轉載于:https://my.oschina.net/u/3803404/blog/1800061
總結
- 上一篇: linux以太坊开发环境搭建
- 下一篇: 【玩转 Angular】1. Angul