異常處理
一、錯誤和異常
程式中難免出現錯誤,而錯誤分為兩種:語言異常和邏輯異常
1.語法錯誤(這種錯誤,根本過不了python直譯器的語法檢測,必須在程式執行前就改正)
for i in range(5)2.邏輯錯誤print(i)
#型別錯誤異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下:num = input(">>>")
int(num)
res = 1/0
res1 = 1+ 'str'
python中有很多不同的異常種類,python中不同的異常可以用不同的型別(python中統一了類與型別,型別即類)去標識,不同的類物件標識不同的異常,乙個異常標識一種錯誤
例如:
indexerror 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]二、異常處理keyerror 試圖訪問字典裡不存在的鍵
typeerror 傳入物件型別與要求的不符合
1、什麼叫異常處理
python直譯器檢測到錯誤,觸發異常(也允許程式設計師自己觸發異常)
程式設計師編寫特定的**,專門用來捕捉這個異常(這段**與程式邏輯無關,與異常處理有關)。如果捕捉成功則進入另外乙個處理分支,執行你為其定製的處理邏輯,使程式不會崩潰,這就是異常處理。
因為python解析器去執行程式,檢測到了乙個錯誤時,會觸發異常,異常觸發之後且在沒被處理的情況下,程式就在當前異常處終止,後面的**不會執行。就會導致執行的軟體崩潰。而異常處理機制就是間接的增強程式的容錯性,讓程式遇到錯誤時不會停止,軟體正常執行,而不是崩潰。
2、怎麼處理異常
首先須知,異常是由程式的錯誤引起的,語法上的錯誤跟異常處理無關,必須在程式執行前就修正
處理異常有兩種方式:1、用if判斷;2、try: **段 except 異常: 處理方式
1、用if判斷
l = [1,2,3,4,5]總結:1.if判斷式的異常處理只能針對某一段**,對於不同的**段的相同型別的錯誤你需要寫重複的if來進行處理。if len(l) >1000: #條件不滿足,跳過
print(l.index(1000))
else:
print(l[4])
2.在你的程式中頻繁的寫與程式本身無關,與異常處理有關的if,就像是在你的**中到處插**,直接導致可讀性極其的差。
3.if是可以解決異常的,只是存在1,2的問題。所以,千萬不要妄下定論if不能用來異常處理。
2、try: **段 except 異常: 處理方式 exception 萬能異常,捕捉所有異常
python為每一種異常定製了乙個型別,然後提供了一種特定的語法結構用來進行異常處理
1)基本語法:
try:2)異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。被檢測的**塊
except 異常型別:
try中一旦檢測到異常,就執行這個位置的邏輯
try:3)不同型別的異常類可以同時存在,構成多分支結構!print("11111")
print("22222")
print(x)
print("33333")
print("*****")
except nameerror as x:
print(x)
print("繼續執行其他操作!")
#執行結果:
11111
22222
name 'x' is not defined
繼續執行其他操作!
try:4)萬能異常 在python的異常中,有乙個萬能異常:exception,他可以捕獲任何異常。print("11111")
print("22222")
print(x)
print("33333")
print("*****")
except valueerror as x:
print(x)
except keyerror as y:
print(y)
except nameerror as z:
print(z)
print("繼續執行其他操作!")
try:5)異常的其他機構print("11111")
print("22222")
print(x)
print("33333")
print("*****")
except valueerror as x:
print(x)
except keyerror as y:
print(y)
except exception as z: #捕獲其他任何異常
print(z)
print("繼續執行其他操作!")
try:6)主動觸發異常print("=---->")
print(x)
print("-=--->")
except nameerror as x:
print(x)
except exception as y:
print(y)
else:
print("try內**塊沒有異常則執行!")
finally:
print("無論異常與否,都會執行該模組,通常是進行清理工作")
print("繼續執行其他操作!")
#執行結果:
=---->
name 'x' is not defined
無論異常與否,都會執行該模組,通常是進行清理工作
繼續執行其他操作!
7)自定義異常(由於異常是類,自定義異常類的時候,需要繼承基類-萬能異常)
#_*_coding:utf-8_*_8)斷言 assert 條件class alexexception(baseexception):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
raise alexexception('型別錯誤')
except alexexception as e:
print(e)
x = 1總結:什麼是異常,異常就是錯誤引發的結果y = 1
assert x == y #x = y 判斷對就執行,不對就拋異常
print('=-====>')
y = 2
assert x == y #判斷 對就執行,不對就拋異常
print('=-====>')
什麼是處理,由於異常帶來的是程式崩潰,處理的目的就是讓程式在異常後跳轉到其他邏輯去執行,不讓程式崩潰
if 和 try...excpet都可以進行異常處理判斷,只不過if是針對一種異常的多分支,針對不同段**的同種型別錯誤,你需要重複寫多分支if,而try是針對不同型別異常的多分支,可以把不同段**放到一起,檢測他們的同種型別錯誤。
過多的使用某個處理異常的方式,就會直接導致程式可讀性及其的差。所以要分清情況再選擇處理異常的方式。try...except應該盡量少用,因為它本身就是你附加給你的程式的一種異常處理的邏輯,與你的主要的工作是沒有關係的。只有在有些異常無法預知的情況下,才應該加上try...except,其他的邏輯錯誤應該盡量修正
歸納總結:
異常處理
分成兩種:一種是由語法上的錯誤引發的異常;
另外一種是邏輯上的錯誤引發的異常。
對於語法上的異常:應該是在程式執行前就改正;
對於邏輯上的錯誤,盡量使用if來預防異常;
對於邏輯上無法預知的錯誤,應該用try...except...去處理
語法:try:
被監測的**塊
except 異常型別 as e:
print(e)
except exception as e: #萬能異常
pass
else:
沒有異常時觸發
finally:
有沒有異常都觸發
#自定義異常:
class myexception(baseexception):
pass
#主動拋異常:
raise type('異常值')
#斷言 程式執行到這一步,進行判斷,然後在再執行。
assert 1 == 1 assert 1==2
注意點:不要把異常處理作為程式設計邏輯錯誤的尚方寶劍,能少用盡量少用。
python異常處理 Python 異常處理
使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...
python異常舉例 Python異常處理
1.1異常問題舉例 例一 i input 請輸入數字 請輸入數字 0 print i print 5 int i traceback most recent call last file line 1,in zerodivisionerror division by zero 上述 的報錯是除零的錯...
python異常處理
當你的程式中出現異常情況時就需要異常處理。比如當你開啟乙個不存在的檔案時。當你的程式中有一些無效的語句時,python會提示你有錯誤存在。下面是乙個拼寫錯誤的例子,print寫成了print。python是大小寫敏感的,因此python將引發乙個錯誤 print hello world file l...