一篇文章帶你了解python異?;A(chǔ)
1. 程序中的問題
1.1 低級(jí)語法錯(cuò)誤
低級(jí)錯(cuò)誤純屬語法錯(cuò)誤,代碼主要在編寫、調(diào)試階段就報(bào)錯(cuò)。
>>> if True SyntaxError: invalid syntax >>>
上述錯(cuò)誤是初學(xué)時(shí)很容易犯的語法錯(cuò)誤,True后面缺少冒號(hào)(:)。
1.2 中介錯(cuò)誤:代碼存在隱性錯(cuò)誤
隱形錯(cuò)誤主要是指代碼編寫存在邏輯錯(cuò)誤或缺陷,當(dāng)程序滿足特定數(shù)據(jù)處理?xiàng)l件時(shí),報(bào)錯(cuò)或給出錯(cuò)誤答案。
>>> def print_D(dic):
i=0
len1=len(dic)
while i < len1:
print(dic.popitem()) #隨機(jī)刪除并返回一個(gè)元素
i+=1
>>> print_D({1:'a',2:'b'})
(2, 'b')
(1, 'a')
上述代碼能夠正常運(yùn)行,但是在實(shí)際的程序使用過程中,可能另一個(gè)程序員傳遞一個(gè)非字典對(duì)象后。
>>> 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'
錯(cuò)誤的傳遞對(duì)象導(dǎo)致了正常程序出錯(cuò),這就是隱性錯(cuò)誤。隱性錯(cuò)誤的特點(diǎn)是正常情況下程序正常運(yùn)行,特殊情況下(如邊界值沒有考慮到,傳入數(shù)據(jù)沒有仔細(xì)檢查類型等)出錯(cuò)。有些隱性錯(cuò)誤甚至不報(bào)錯(cuò),而是由結(jié)果輸出,這是最糟糕的情況。
1.3 高級(jí)錯(cuò)誤:軟件面對(duì)不確定性的異常錯(cuò)誤
高級(jí)錯(cuò)誤指不確定性的錯(cuò)誤,主要指軟件的代碼本身沒有問題,所輸入的數(shù)據(jù)也能得到控制或保證,而是在運(yùn)行過程中環(huán)境所帶來的不確定性異常。如:
(1)軟件本身去嘗試打開一個(gè)文件,而這個(gè)文件已經(jīng)被破壞或獨(dú)占(獨(dú)占指一個(gè)進(jìn)程(線程)處理過程,其他進(jìn)程(線程)無法同步處理,只能等待這個(gè)進(jìn)程(線程)處理完成,其他進(jìn)程(線程)才能繼續(xù)操作)。
(2)軟件在往數(shù)據(jù)庫(kù)插入數(shù)據(jù)過程中,突然網(wǎng)絡(luò)中斷,導(dǎo)致數(shù)據(jù)丟失
(3)軟件運(yùn)行硬件出現(xiàn)故障,導(dǎo)致軟件無法正常運(yùn)行等
(4)數(shù)據(jù)庫(kù)系統(tǒng)被破壞,軟件讀寫數(shù)據(jù)報(bào)錯(cuò)
(5)軟件輸入內(nèi)容過度復(fù)雜或存在錯(cuò)誤操作,。
2. 捕捉異常
2.1 基本異常捕捉語句
基本異常捕捉語句語法
try: 代碼模塊1 except: 代碼模塊2
try關(guān)鍵字,表示捕捉異常語句的開始;代碼模塊1,屬于正常需要執(zhí)行的代碼模塊;except關(guān)鍵字,用于捕捉異常信息,并可以給出出錯(cuò)信息(默認(rèn)英文提示)。

(1)先執(zhí)行try語句,代表捕捉異常機(jī)制開始
(2)執(zhí)行代碼模塊1,若沒有出錯(cuò),忽略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(往往給出錯(cuò)誤信息提示或做出錯(cuò)后問題處理),異常處理結(jié)束
示例
>>> def print_D(dic):
i=0
try:
len1=len(dic)
while i < len1:
print(dic.popitem())
i+=1
except:
print('傳遞值類型出錯(cuò),必須為字典類型!')
>>> print_D({1:'a',2:'b'})
(2, 'b')
(1, 'a')
>>> print_D([1,2,3,4])
傳遞值類型出錯(cuò),必須為字典類型! #出錯(cuò)后的正確提示信息
2.2 帶finally子句的異常處理
基本格式:
try: 代碼模塊1 except: 代碼模塊2 finally: 代碼模塊3
finally關(guān)鍵字后的代碼模塊3,運(yùn)行代碼模塊1是否出錯(cuò)都會(huì)執(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)運(yùn)行結(jié)束')
>>>
#運(yùn)行結(jié)果
0.5
出現(xiàn)運(yùn)行結(jié)束
案例 3
import sys
try:
1/0
except:
print('除數(shù)不能為0')
sys.exit()
finally:
print('程序執(zhí)行結(jié)束')
print('我能執(zhí)行碼?')
>>>
#運(yùn)行結(jié)果
除數(shù)不能為0
程序執(zhí)行結(jié)束
2.3 try-except-else 結(jié)構(gòu)
結(jié)構(gòu)運(yùn)行過程:程序進(jìn)入try語句部分,當(dāng)try語句部分發(fā)生異常則進(jìn)入except語句部分,若不發(fā)生異常進(jìn)入else語句部分。
try:
print("正常代碼")
except Exception as e:
print("將不會(huì)輸出這句話")
else:
print("這句話將被輸出")
print('-'*30)
try:
print(1/0)
except Exception as e:
print("進(jìn)入異常處理")
else:
print("不會(huì)輸出")
>>>
#運(yùn)行結(jié)果
正常代碼
這句話將被輸出
------------------------------
進(jìn)入異常處理
2.4 try-except-else-finally 結(jié)構(gòu)
try:
print("沒有異常")
except Exception as e:
print("不會(huì)輸出!")
else:
print("進(jìn)入else")
finally:
print("必須輸出!")
print('-'*30)
try:
print(1/0)
except Exception as e:
print("引發(fā)異常")
else:
print("不會(huì)進(jìn)入else")
finally:
print("必須輸出!")
>>>
# 運(yùn)行結(jié)果
沒有異常
進(jìn)入else
必須輸出!
------------------------------
引發(fā)異常
必須輸出!
2.5 捕捉特定異常信息

3. 拋出異常
python允許程序員自己觸發(fā)異常,可以通過raise關(guān)鍵字來實(shí)現(xiàn),使用格式:
raise [Exception]
Exception參數(shù)可選,其對(duì)象如上表所示的Exception類的子類。
示例一:不帶參數(shù)的觸發(fā)
>>> raise
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
raise
RuntimeError: No active exception to reraise
>>>
代碼通過raise子句拋出一個(gè)沒有問題的異常信息。
示例二:帶參數(shù)的觸發(fā)
>>> i='1'
>>> if type(i)!=int:
raise TypeError('i類型出錯(cuò)!')
Traceback (most recent call last):
File "<pyshell#57>", line 2, in <module>
raise TypeError('i類型出錯(cuò)!')
TypeError: i類型出錯(cuò)!
>>>
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
python數(shù)據(jù)類型可變不可變知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給各位整理的是關(guān)于python數(shù)據(jù)類型可變不可變知識(shí)點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)下。2020-03-03
DjangoWeb使用Datatable進(jìn)行后端分頁的實(shí)現(xiàn)
這篇文章主要介紹了DjangoWeb使用Datatable進(jìn)行后端分頁的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
python pandas最常用透視表實(shí)現(xiàn)應(yīng)用案例
透視表是一種可以對(duì)數(shù)據(jù)動(dòng)態(tài)排布并且分類匯總的表格格式,它在數(shù)據(jù)分析中有著重要的作用和地位,在本文中,我將為你介紹python中如何使用pandas包實(shí)現(xiàn)透視表的功能,以及一些常見的應(yīng)用案例2024-01-01
使用Python編程分析火爆全網(wǎng)的魷魚游戲豆瓣影評(píng)
本文來為大家介紹如何使用Python爬取影評(píng)的操作,主要是爬取《魷魚游戲》在豆瓣上的一些影評(píng),對(duì)數(shù)據(jù)做一些簡(jiǎn)單的分析,用數(shù)據(jù)的角度重新審視下這部劇,有需要的朋友可以借鑒參考下2021-10-10
如何使用python統(tǒng)計(jì)字符在文件中出現(xiàn)的次數(shù)
在開發(fā)過程中很多時(shí)候我們有統(tǒng)計(jì)單個(gè)字符或者字符串在另一個(gè)字符串中出現(xiàn)次數(shù)的需求,下面這篇文章主要給大家介紹了關(guān)于如何使用python統(tǒng)計(jì)字符在文件中出現(xiàn)的次數(shù)的相關(guān)資料,需要的朋友可以參考下2023-03-03

