通常狀況下在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 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 |
根據輸出結果能夠看到,無異常出現的時候前後執行了try
、else
和finally
語句塊,未執行except
語句塊。
在異常處理時else
和finally
語句塊能夠沒有。code
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}]} |