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