python21-異常處理

調(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)不是所有的代碼都做異常處理,會使代碼邏輯看起來復雜化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸟妙,隨后出現(xiàn)的幾起案子焦人,更是在濱河造成了極大的恐慌,老刑警劉巖重父,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件花椭,死亡現(xiàn)場離奇詭異,居然都是意外死亡房午,警方通過查閱死者的電腦和手機矿辽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郭厌,“玉大人袋倔,你說我怎么就攤上這事≌勰” “怎么了宾娜?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扇售。 經(jīng)常有香客問我前塔,道長,這世上最難降的妖魔是什么承冰? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任华弓,我火速辦了婚禮,結(jié)果婚禮上困乒,老公的妹妹穿的比我還像新娘寂屏。我一直安慰自己,他們只是感情好顶燕,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布凑保。 她就那樣靜靜地躺著冈爹,像睡著了一般涌攻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上频伤,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天恳谎,我揣著相機與錄音,去河邊找鬼。 笑死因痛,一個胖子當著我的面吹牛婚苹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸵膏,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼膊升,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谭企?” 一聲冷哼從身側(cè)響起廓译,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎债查,沒想到半個月后非区,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡盹廷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年征绸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俄占。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡管怠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颠放,到底是詐尸還是另有隱情排惨,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布碰凶,位于F島的核電站暮芭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏欲低。R本人自食惡果不足惜辕宏,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾莱。 院中可真熱鬧瑞筐,春花似錦、人聲如沸腊瑟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闰非。三九已至膘格,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間财松,已是汗流浹背瘪贱。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工纱控, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菜秦。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓甜害,卻偏偏與公主長得像,于是被迫代替她去往敵國和親球昨。 傳聞我的和親對象是個殘疾皇子尔店,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • python提供了兩個非常重要的功能來處理python程序在運行中出現(xiàn)的異常和錯誤闹获。你可以使用該功能來調(diào)試pyth...
    _寧采臣閱讀 1,025評論 0 10
  • @[toc]??編寫計算機程序時,通常能夠區(qū)分正常和異常情況河哑。異常事件可能是錯誤,也可能是通常不會發(fā)生的事情避诽。為處...
    奮斗在阿爾卑斯的皮卡丘閱讀 809評論 0 0
  • 一沙庐、概要 ? 一個程序即使沒有任何語法錯誤,即使解題的邏輯也正確佳吞,在執(zhí)行的時候仍然可能出現(xiàn) 各種“運行時錯誤”拱雏,導...
    唯老閱讀 425評論 0 1
  • 一、簡介 Python最強大的結(jié)構(gòu)之一就是它的異常處理能力底扳,所有的標準異常都使用類來實現(xiàn)铸抑,都是基類Exceptio...
    隨風化作雨閱讀 3,073評論 0 1
  • 一、錯誤和異常 1衷模、錯誤 從軟件方面來講鹊汛,錯誤通常是語法或邏輯上的。語法錯誤會導致程序代碼不能被解釋器解釋阱冶,這些錯...
    常大鵬閱讀 1,340評論 0 6