一篇文章帶你了解python異?;A(chǔ)
1. 程序中的問題
1.1 低級語法錯誤
低級錯誤純屬語法錯誤,代碼主要在編寫、調(diào)試階段就報錯。
>>> if True SyntaxError: invalid syntax >>>
上述錯誤是初學(xué)時很容易犯的語法錯誤,True后面缺少冒號(:)。
1.2 中介錯誤:代碼存在隱性錯誤
隱形錯誤主要是指代碼編寫存在邏輯錯誤或缺陷,當(dāng)程序滿足特定數(shù)據(jù)處理條件時,報錯或給出錯誤答案。
>>> def print_D(dic): i=0 len1=len(dic) while i < len1: print(dic.popitem()) #隨機刪除并返回一個元素 i+=1 >>> print_D({1:'a',2:'b'}) (2, 'b') (1, 'a')
上述代碼能夠正常運行,但是在實際的程序使用過程中,可能另一個程序員傳遞一個非字典對象后。
>>> print_D([1,2,3,4]) Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> print_D([1,2,3,4]) File "<pyshell#9>", line 5, in print_D print(dic.popitem()) AttributeError: 'list' object has no attribute 'popitem'
錯誤的傳遞對象導(dǎo)致了正常程序出錯,這就是隱性錯誤。隱性錯誤的特點是正常情況下程序正常運行,特殊情況下(如邊界值沒有考慮到,傳入數(shù)據(jù)沒有仔細(xì)檢查類型等)出錯。有些隱性錯誤甚至不報錯,而是由結(jié)果輸出,這是最糟糕的情況。
1.3 高級錯誤:軟件面對不確定性的異常錯誤
高級錯誤指不確定性的錯誤,主要指軟件的代碼本身沒有問題,所輸入的數(shù)據(jù)也能得到控制或保證,而是在運行過程中環(huán)境所帶來的不確定性異常。如:
(1)軟件本身去嘗試打開一個文件,而這個文件已經(jīng)被破壞或獨占(獨占指一個進程(線程)處理過程,其他進程(線程)無法同步處理,只能等待這個進程(線程)處理完成,其他進程(線程)才能繼續(xù)操作)。
(2)軟件在往數(shù)據(jù)庫插入數(shù)據(jù)過程中,突然網(wǎng)絡(luò)中斷,導(dǎo)致數(shù)據(jù)丟失
(3)軟件運行硬件出現(xiàn)故障,導(dǎo)致軟件無法正常運行等
(4)數(shù)據(jù)庫系統(tǒng)被破壞,軟件讀寫數(shù)據(jù)報錯
(5)軟件輸入內(nèi)容過度復(fù)雜或存在錯誤操作,。
2. 捕捉異常
2.1 基本異常捕捉語句
基本異常捕捉語句語法
try: 代碼模塊1 except: 代碼模塊2
try關(guān)鍵字,表示捕捉異常語句的開始;代碼模塊1,屬于正常需要執(zhí)行的代碼模塊;except關(guān)鍵字,用于捕捉異常信息,并可以給出出錯信息(默認(rèn)英文提示)。
(1)先執(zhí)行try語句,代表捕捉異常機制開始
(2)執(zhí)行代碼模塊1,若沒有出錯,忽略except關(guān)鍵字和代碼模塊2,代碼正常執(zhí)行完畢
(3)若執(zhí)行代碼模塊1過程發(fā)生異?,F(xiàn)象,則終止代碼模塊1內(nèi)剩余代碼的執(zhí)行,轉(zhuǎn)到except處
(4)except關(guān)鍵字捕捉到異常信息,并執(zhí)行代碼模塊2(往往給出錯誤信息提示或做出錯后問題處理),異常處理結(jié)束
示例
>>> def print_D(dic): i=0 try: len1=len(dic) while i < len1: print(dic.popitem()) i+=1 except: print('傳遞值類型出錯,必須為字典類型!') >>> print_D({1:'a',2:'b'}) (2, 'b') (1, 'a') >>> print_D([1,2,3,4]) 傳遞值類型出錯,必須為字典類型! #出錯后的正確提示信息
2.2 帶finally子句的異常處理
基本格式:
try: 代碼模塊1 except: 代碼模塊2 finally: 代碼模塊3
finally關(guān)鍵字后的代碼模塊3,運行代碼模塊1是否出錯都會執(zhí)行的代碼功能。
案例 1
>>> try: 1/0 except: print('除數(shù)不能為0') finally: print('出現(xiàn)執(zhí)行結(jié)束') >>>
案例 2
>>> try: 1/2 except: print('出書不能為0') finally: print('出現(xiàn)運行結(jié)束') >>>
#運行結(jié)果
0.5
出現(xiàn)運行結(jié)束
案例 3
import sys try: 1/0 except: print('除數(shù)不能為0') sys.exit() finally: print('程序執(zhí)行結(jié)束') print('我能執(zhí)行碼?') >>>
#運行結(jié)果
除數(shù)不能為0
程序執(zhí)行結(jié)束
2.3 try-except-else 結(jié)構(gòu)
結(jié)構(gòu)運行過程:程序進入try語句部分,當(dāng)try語句部分發(fā)生異常則進入except語句部分,若不發(fā)生異常進入else語句部分。
try: print("正常代碼") except Exception as e: print("將不會輸出這句話") else: print("這句話將被輸出") print('-'*30) try: print(1/0) except Exception as e: print("進入異常處理") else: print("不會輸出") >>>
#運行結(jié)果
正常代碼
這句話將被輸出
------------------------------
進入異常處理
2.4 try-except-else-finally 結(jié)構(gòu)
try: print("沒有異常") except Exception as e: print("不會輸出!") else: print("進入else") finally: print("必須輸出!") print('-'*30) try: print(1/0) except Exception as e: print("引發(fā)異常") else: print("不會進入else") finally: print("必須輸出!") >>>
# 運行結(jié)果
沒有異常
進入else
必須輸出!
------------------------------
引發(fā)異常
必須輸出!
2.5 捕捉特定異常信息
3. 拋出異常
python允許程序員自己觸發(fā)異常,可以通過raise關(guān)鍵字來實現(xiàn),使用格式:
raise [Exception]
Exception參數(shù)可選,其對象如上表所示的Exception類的子類。
示例一:不帶參數(shù)的觸發(fā)
>>> raise Traceback (most recent call last): File "<pyshell#52>", line 1, in <module> raise RuntimeError: No active exception to reraise >>>
代碼通過raise子句拋出一個沒有問題的異常信息。
示例二:帶參數(shù)的觸發(fā)
>>> i='1' >>> if type(i)!=int: raise TypeError('i類型出錯!') Traceback (most recent call last): File "<pyshell#57>", line 2, in <module> raise TypeError('i類型出錯!') TypeError: i類型出錯! >>>
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注本站的更多內(nèi)容!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。