第十次课
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
python異常處理
異常
一般情況下在python無法正常處理程序時(shí)就會(huì)發(fā)生一個(gè)異常。
異常是python對(duì)象,表示一個(gè)錯(cuò)誤。當(dāng)python程序發(fā)生錯(cuò)誤時(shí)需要捕獲處理,否則程序會(huì)終止執(zhí)行。
異常處理
捕獲異常可以使用try/except語句。
該語句用來檢測(cè)try語句塊中的錯(cuò)誤,從而讓except語句捕獲異常信息并處理。
-
語法規(guī)則
1 2 3 4 5 6 7 8 9 10 try: <語句> #運(yùn)行別的代碼 except <名字>: <語句> #如果在try部份引發(fā)了'name'異常 except <名字>,<數(shù)據(jù)>: <語句> #如果引發(fā)了'name'異常,獲得附加的數(shù)據(jù) else: <語句> #如果沒有異常發(fā)生 finally: <語句> #不管如何,最后一定執(zhí)行的代碼 -
處理流程
當(dāng)開始一個(gè)try語句后,python會(huì)在當(dāng)前程序的上下文中進(jìn)行標(biāo)記,這樣當(dāng)異常出現(xiàn)時(shí)就可以回到這里,try子句先執(zhí)行,接下來發(fā)生什么依賴于執(zhí)行時(shí)是否出現(xiàn)異常。
實(shí)例
- 有異常出現(xiàn)被捕獲的情況
1 2 3 4 5 6 7 8 9 10 try:print("開始計(jì)算")result = 2/0print("計(jì)算結(jié)果為:{0}".format(result)) except Exception as e:print("除數(shù)不能為0") else:print("無異常出現(xiàn)") finally:print("done")
輸出結(jié)果
| 1 2 3 | 開始計(jì)算 除數(shù)不能為0 done |
?
根據(jù)輸出結(jié)果可以看到,有異常出現(xiàn)的時(shí)候,先執(zhí)行try語句,遇到異常則停止執(zhí)行下面的語句(print("計(jì)算結(jié)果為:{0}".format(result))未執(zhí)行),跳轉(zhuǎn)至錯(cuò)誤處理代碼,也就是except語句塊,執(zhí)行完except后執(zhí)行finally語句塊。不執(zhí)行else語句塊。
- 無異常出現(xiàn)情況
1 2 3 4 5 6 7 8 9 10 try:print("開始計(jì)算")result = 2/1print("計(jì)算結(jié)果為:{0}".format(result)) except Exception as e:print("除數(shù)不能為0") else:print("無異常出現(xiàn)") finally:print("done")
輸出結(jié)果
| 1 2 3 4 | 開始計(jì)算 計(jì)算結(jié)果為:2.0 無異常出現(xiàn) done |
?
根據(jù)輸出結(jié)果可以看到,無異常出現(xiàn)的時(shí)候先后執(zhí)行了try、else和finally語句塊,未執(zhí)行except語句塊。
在異常處理時(shí)else和finally語句塊可以沒有。
- raise拋出錯(cuò)誤
1 2 3 4 5 6 7 8 9 10 11 try:print("開始計(jì)算")result = 2/0print("計(jì)算結(jié)果為:{0}".format(result)) except Exception as e:print("除數(shù)不能為0")raise e #添加raise語句拋出錯(cuò)誤 else:print("無異常出現(xiàn)") finally:print("done")
輸出結(jié)果
| 1 2 3 4 5 6 7 | 開始計(jì)算 除數(shù)不能為0 done Traceback (most recent call last):File "<stdin>", line 7, in <module>File "<stdin>", line 3, in <module> ZeroDivisionError: division by zero |
?
通過添加raise拋出錯(cuò)誤,我們可以看到錯(cuò)誤類型為ZeroDivisionError。
在python中內(nèi)置了很多的錯(cuò)誤類型,我們可以通過針對(duì)不同的錯(cuò)誤類型,可以使用不同的except語句處理。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | try:print("開始計(jì)算")result = 2/int('a')print("計(jì)算結(jié)果為:{0}".format(result)) except ZeroDivisionError as e:print("除數(shù)不能為0")raise e except ValueError as e:print("ValueError")raise e else:print("無異常出現(xiàn)") finally:print("done") |
?
輸出結(jié)果
| 1 2 3 4 5 6 7 | 開始計(jì)算 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' |
?
此時(shí)執(zhí)行try語句塊時(shí),int()函數(shù)拋出ValueError異常,所以執(zhí)行了第二個(gè)except捕獲對(duì)應(yīng)異常信息。
前面我們?cè)趀xcept中直接使用Exception,由于大部分的錯(cuò)誤類型都是繼承自該類型,所以可直接捕獲其子類。
python中所有的錯(cuò)誤都是從BaseException類派生的,點(diǎn)擊查看常見的錯(cuò)誤類型和繼承關(guān)系。
異常信息規(guī)范輸出
在常見的前后端分離開發(fā)環(huán)境中,對(duì)于異常信息通常都是按照約定格式,返回json字符串,從而將異常信息記錄下來。
下面是一個(gè)示例
| 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) #字典轉(zhuǎn)換為json串if __name__ == '__main__':print(log()) |
?
輸出結(jié)果
| 1 | {"msg": "Division can not be 0", "code": 250, "data": [{"a": 1}, {"b": 2}]} |
轉(zhuǎn)載于:https://my.oschina.net/u/3803404/blog/1800061
總結(jié)
- 上一篇: linux以太坊开发环境搭建
- 下一篇: 【玩转 Angular】1. Angul