調(diào)試Python程序時(shí)經(jīng)常會(huì)報(bào)出一些異常,這時(shí)就需要我們對(duì)異常進(jìn)行捕獲處理,防止程序終止,本篇主要圍繞異常處理操作而展開。希望感興趣的小伙伴可以堅(jiān)持看下去同時(shí)歡迎提出寶貴的意見讓我們一起進(jìn)步!
01:什么是異常?
1)概念:異常即是一個(gè)事件,該事件會(huì)在程序執(zhí)行過程中發(fā)生,影響了程序的正常執(zhí)行。異常是Python對(duì)象,表示一個(gè)錯(cuò)誤。
2)注意事項(xiàng):
①一般情況下,在Python無法正常處理程序時(shí)就會(huì)發(fā)生一個(gè)異常。
②當(dāng)Python腳本發(fā)生異常時(shí)我們需要捕獲處理它,否則程序會(huì)終止執(zhí)行。
3)異常作用: 出現(xiàn)異常程序不要退出,可以繼續(xù)執(zhí)行同時(shí)給予程序員一定的異常提示信息
02:常見的異常種類
| 異常名稱 | 異常描述 |
|---|---|
| SyntaxError | 語法錯(cuò)誤時(shí)會(huì)拋出此異常 |
| NameError | 使用一個(gè)還未被賦予對(duì)象的變量 |
| TypeError | 傳入對(duì)象類型與要求的不符合 |
| ZeroDivisionError | 進(jìn)行數(shù)學(xué)運(yùn)算時(shí)除數(shù)為0時(shí)會(huì)出現(xiàn)此異常 |
| IndexError | 下標(biāo)索引超出序列邊界 |
| KeyError | 試圖訪問字典里不存在的鍵 |
| ImportError | 無法引入模塊或包;基本上是路徑問題或名稱錯(cuò)誤 |
| IndentationError | 代碼沒有正確對(duì)齊,即縮進(jìn)錯(cuò)誤 |
| ValueError | 傳入一個(gè)調(diào)用者不期望的值,即傳入無效的參數(shù) |
| AssertionError | 當(dāng)assert斷言條件為假的時(shí)候拋出的異常 |
| OSError | 操作系統(tǒng)異常 |
更多詳細(xì)的錯(cuò)誤參考:https://www.runoob.com/python/python-exceptions.html
03:異常捕獲關(guān)鍵字
| 異常名稱 | 異常描述 |
|---|---|
| try/except | 捕獲異常并處理 |
| pass | 忽略異常 |
| as | 定義異常實(shí)例(except MyError as e) |
| else | 如果try中的語句沒有引發(fā)異常,則執(zhí)行else中的語句 |
| finally | 無論是否出現(xiàn)異常,都執(zhí)行的代碼 |
| raise | 拋出/引發(fā)異常 |
04:try與except結(jié)合用法捕獲異常
1)概述:用來檢測try語句塊中的錯(cuò)誤,從而讓except語句捕獲異常信息并處理。一般捕獲已知異常
2)原理:
①首先執(zhí)行try語句 (try和except關(guān)鍵字之間的(多行)語句)
②如果沒有異常發(fā)生,則跳過except語句并完成try語句的執(zhí)行。
③如果在執(zhí)行try語句時(shí)發(fā)生了異常,則跳過該子句中剩下的部分。若異常類型和 except關(guān)鍵字后面的異常匹配,則執(zhí)行 except 語句,然后繼續(xù)執(zhí)行try語句之后的代碼。
④如果發(fā)生的異常和 except 語句中指定的異常不匹配,則將其傳遞到外部的try語句中;如果沒有找到處理程序,則它是一個(gè)未處理異常,程序?qū)⑼V?/strong>。
while True:
num=input('請(qǐng)輸入數(shù)字:')
try:
# 如果除數(shù)為0時(shí)將拋出ZeroDivisionError異常
print('100/%s=%s'%(num,100.0/int(num)))
# 如果捕獲到ZeroDivisionError異常將執(zhí)行except下面的代碼塊
except ZeroDivisionError:#已知異常,一一對(duì)應(yīng)
print('除數(shù)不能輸入不能為0喲!!')
05:多個(gè)except捕獲異常
1)一個(gè)try語句可能有多個(gè) except 子句,以指定不同異常的處理程序。最多只會(huì)執(zhí)行一個(gè)處理程序
2)一個(gè)except子句可以將多個(gè)異常命名為帶括號(hào)的元組,這種寫法不區(qū)分優(yōu)先級(jí)。except (RuntimeError, TypeError):
while True:
num=input('請(qǐng)輸入數(shù)字:')
try:
# 如果除數(shù)為0時(shí)將拋出ZeroDivisionError異常
print('100/%s=%s'%(num,100.0/int(num)))
# 如果捕獲到ZeroDivisionError異常將執(zhí)行except下面的代碼塊
except ZeroDivisionError:
print('除數(shù)不能輸入不能為0喲!!')
except ValueError as error: # error表示具體的異常信息
print('除數(shù)不能輸入字符串喲!!', error)
06:try與except與else捕獲異常
1)沒有異常的情況下,要執(zhí)行一段代碼。
2)else 子句在使用時(shí)必須放在所有的 except 代碼塊后面,finally前面。
while True:
num=input('請(qǐng)輸入數(shù)字:')
try:
print('100/%s=%s'%(num,100.0/int(num)))
except ZeroDivisionError:
print('除數(shù)不能輸入不能為0喲!!')
except ValueError as error:
print('除數(shù)不能輸入字符串喲!!', error)
else: #當(dāng)try代碼塊中執(zhí)行沒有發(fā)現(xiàn)任何異常的時(shí)候執(zhí)行這里的語句
print("Program execution successful")
07:try與except與finally捕獲異常
1)不管是否有異常,都要執(zhí)行一段代碼。finally一般要放到最后
2)finally子句對(duì)于釋放外部資源非常有用
3)應(yīng)用場景:用在打開文件,在文件處理過程過中出異常退出,這時(shí)文件沒有關(guān)閉或者網(wǎng)絡(luò)連接
try:
txt = open("C:/Users/qin/Desktop/file1.txt")
# 上面打開文件默認(rèn)以r方式打開,這里會(huì)拋出IOError異常
txt.write("這是一個(gè)測試文件,用于測試異常!!")
except IOError as e: # e為異常信息
print("異常信息為:",e)
finally: #不管有沒有民常都會(huì)執(zhí)行finally代碼塊中的語句
txt.close()
08:捕獲所有異常(Exception)
1)Exception是所有異常的父類,但是不能通過該程序識(shí)別出具體的異常信息
while True:
num=input('請(qǐng)輸入數(shù)字:')
try:
print('100/%s=%s'%(num,100.0/int(num)))
except Exception as error: # 異常的父類:所有異常
print('有異常!!', error)
09:捕獲具體異常(traceback)
1)traceback可以用來捕獲未知異常具體信息
import traceback#捕獲具體異常信息模塊
while True:
num=input('請(qǐng)輸入數(shù)字:')
try:
print('100/%s=%s'%(num,100.0/int(num)))
except:
print('有異常!!', traceback.format_exc()) # 捕獲具體異常信息
10:主動(dòng)觸發(fā)異常(raise)
1)raise語句允許程序員強(qiáng)制發(fā)生指定的異常
2)格式:raise 異常類型; raise也可單獨(dú)使用
for one in range(1,6):
if one ==2:
raise ValueError("當(dāng)i等于2時(shí)拋出這個(gè)異常")
print(one)
11:自定義異常
1)Python中也可以自定義特殊類型的異常,只需要從Exception類繼承(直接或間接)即可
class SomeException(Exception):
pass
12:斷言(assert)
1)使用場景:如果后續(xù)代碼比較重要且依靠前面的數(shù)據(jù)/狀態(tài)
tel=input('請(qǐng)輸入手機(jī)號(hào):')
assert len(tel)==11,'手機(jī)號(hào)位數(shù)有誤'
print('我在測試手機(jī)號(hào)長度')
13:捕獲異常注意事項(xiàng)
1)常用的異常場景:WebUI元素定位、打開文件、數(shù)據(jù)庫連接、調(diào)用接口等
2)不是所有的代碼都做異常處理,會(huì)使代碼邏輯看起來復(fù)雜化