一 .什么是異常
異常就是程序運(yùn)行時(shí)發(fā)生錯(cuò)誤的信號(hào)(在程序出現(xiàn)錯(cuò)誤時(shí)十兢,則會(huì)產(chǎn)生一個(gè)異常勋颖,若程序沒(méi)有處理它,則會(huì)拋出該異常蓖租,程序的運(yùn)行也隨之終止)粱侣,在python中,錯(cuò)誤觸發(fā)的異常如下
異常示例.png
而錯(cuò)誤分為兩類(lèi):
1 . 語(yǔ)法錯(cuò)誤(這種錯(cuò)誤,根本過(guò)不了python解釋器的語(yǔ)法檢測(cè)蓖宦,必須在程序執(zhí)行前就改正)
示例如下:
#語(yǔ)法錯(cuò)誤示范一
if
#語(yǔ)法錯(cuò)誤示范二
def test:
pass
#語(yǔ)法錯(cuò)誤示范三
class Foo
pass
#語(yǔ)法錯(cuò)誤示范四
print(haha
2 . 邏輯錯(cuò)誤 示例如下:
#TypeError:int類(lèi)型不可迭代
for i in 3:
pass
#ValueError
num=input(">>: ") #輸入hello
int(num)
#NameError
aaa
#IndexError
l=['egon','aa']
l[3]
#KeyError
dic={'name':'egon'}
dic['age']
#AttributeError
class Foo:pass
Foo.x
#ZeroDivisionError:無(wú)法完成計(jì)算
res1=1/0
res2=1+'str'
二 . 異常的種類(lèi)
常見(jiàn)異常
AttributeError 試圖訪問(wèn)一個(gè)對(duì)象沒(méi)有的樹(shù)形齐婴,比如foo.x,但是foo沒(méi)有屬性x
IOError 輸入/輸出異常稠茂;基本上是無(wú)法打開(kāi)文件
ImportError 無(wú)法引入模塊或包柠偶;基本上是路徑問(wèn)題或名稱(chēng)錯(cuò)誤
IndentationError 語(yǔ)法錯(cuò)誤(的子類(lèi)) ;代碼沒(méi)有正確對(duì)齊
IndexError 下標(biāo)索引超出序列邊界,比如當(dāng)x只有三個(gè)元素诱担,卻試圖訪問(wèn)x[5]
KeyError 試圖訪問(wèn)字典里不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個(gè)還未被賦予對(duì)象的變量
SyntaxError Python代碼非法毡证,代碼不能編譯(個(gè)人認(rèn)為這是語(yǔ)法錯(cuò)誤,寫(xiě)錯(cuò)了)
TypeError 傳入對(duì)象類(lèi)型與要求的不符合
UnboundLocalError 試圖訪問(wèn)一個(gè)還未被設(shè)置的局部變量蔫仙,基本上是由于另有一個(gè)同名的全局變量料睛,
導(dǎo)致你以為正在訪問(wèn)它
ValueError 傳入一個(gè)調(diào)用者不期望的值,即使值的類(lèi)型是正確的
更多異常
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
三 . 異常處理
#1 異常類(lèi)只能用來(lái)處理指定的異常情況匀哄,如果非指定異常則無(wú)法處理秦效。
s1 = 'hello'
try:
int(s1)
except IndexError as e: # 未捕獲到異常雏蛮,程序直接報(bào)錯(cuò)
print e
#2 多分支
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
#3 萬(wàn)能異常Exception
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)
#4 多分支異常與萬(wàn)能異常
#4.1 如果你想要的效果是涎嚼,無(wú)論出現(xiàn)什么異常,我們統(tǒng)一丟棄挑秉,或者使用同一段代碼邏輯去處理他們法梯,那么騷年,大膽的去做吧犀概,只有一個(gè)Exception就足夠了立哑。
#4.2 如果你想要的效果是,對(duì)于不同的異常我們需要定制不同的處理邏輯姻灶,那就需要用到多分支了铛绰。
#5 也可以在多分支后來(lái)一個(gè)Exception
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
except Exception as e:
print(e)
#6 異常的其他機(jī)構(gòu)
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
#except Exception as e:
# print(e)
else:
print('try內(nèi)代碼塊沒(méi)有異常則執(zhí)行我')
finally:
print('無(wú)論異常與否,都會(huì)執(zhí)行該模塊,通常是進(jìn)行清理工作')
#7 主動(dòng)觸發(fā)異常
try:
raise TypeError('類(lèi)型錯(cuò)誤')
except Exception as e:
print(e)
#8 自定義異常
class EgonException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
raise EgonException('類(lèi)型錯(cuò)誤')
except EgonException as e:
print(e)
#9 斷言:assert 條件
assert 1 == 1
assert 1 == 2
#10 總結(jié)try..except
1:把錯(cuò)誤處理和真正的工作分開(kāi)來(lái)
2:代碼更易組織,更清晰产喉,復(fù)雜的工作任務(wù)更容易實(shí)現(xiàn)捂掰;
3:毫無(wú)疑問(wèn),更安全了曾沈,不至于由于一些小的疏忽而使程序意外崩潰了这嚣;
四 . 什么時(shí)候用異常處理
有的同學(xué)會(huì)這么想,學(xué)完了異常處理后塞俱,好強(qiáng)大姐帚,我要為我的每一段程序都加上try...except,干毛線去思考它會(huì)不會(huì)有邏輯錯(cuò)誤啊障涯,這樣就很好啊罐旗,多省腦細(xì)胞===》2B青年歡樂(lè)多
首先try...except是你附加給你的程序的一種異常處理的邏輯,與你的主要的工作是沒(méi)有關(guān)系的唯蝶,這種東西加的多了九秀,會(huì)導(dǎo)致你的代碼可讀性變差
然后異常處理本就不是你2b邏輯的擦屁股紙,只有在錯(cuò)誤發(fā)生的條件無(wú)法預(yù)知的情況下生棍,才應(yīng)該加上try...except