錯誤分爲兩種,一種爲語法錯誤,一種爲邏輯錯誤
異常就是程序運行錯誤時發出的型號,或者說是程序運行崩潰的結果
常用異常:
AttributeError
試圖訪問一個對象沒有的屬性,比如調用Foo.x,但是Foo下沒有x屬性
IOError
輸入/輸出異常,基本上是無法打開文件的
ImportError
無法引入模塊或包,基本上是路徑問題或者名稱錯誤
IndentationError
語法錯誤的子類,代碼沒有正確對齊
IndexError
下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyboardInterrupt
這個是在解釋器中按下了ctrl+c
NameError
使用了一個還未被賦予對象的變量
SyntaxError
非法python代碼,個人覺得就是語法錯誤
TypeError
傳入對象類型與要求類型不符合
UnboundLocalError
視圖訪問一個還未被設置的局部變量,基本上是猶豫另一個同名的全局變量,導致你認爲正在訪問它
ValueError
傳入一個調用者不期望的值,即使值得類型是正確的
爲什麼要進行異常處理?
異常處理的目的就是捕捉到產生異常的代碼,使整個代碼不會崩潰而終止,讓邏輯繼續走下去
其實if
也可以做異常處理,但是if的缺點很多,比如說重複代碼的使用和可讀性差等等:
def test():
print('lalalalalalala')
chioce = {
'1':test
}
while True:
chioce_q = input('>>>:').strip()
if not chioce or chioce_q not in chioce:
continue
chioce[chioce_q]()
所以python唯每一種異常定製了一個類型,然後提供了一種特定的語法結構來進行異常處理
try:
被檢測的代碼塊
exxept 異常類型:
try中一旦檢測到異常,就執行這個位置的邏輯代碼
下面是一個將輸入的字符轉換成爲int類型的異常處理:
try:
age = input('>>>')
int(age)
num = input('>>')
int(num)
except ValueError as e:#as是給他起個名字
print(e)
異常類只能用來處理指定的異常情況,如果非指定異常則無法處理,比如說你在except
後面寫的是ValueError
但是是因爲超出取值範圍導致的異常,程序還是會終止,這時就可以用多分支或者萬能異常來處理:
多分支:
try:
age = input('>>')
int(age)
l = [1,2]
l[10]
except ValueError as e:
print(e)
except IndexError as e:
print(e)
萬能異常:
try:
age = input('>>>')
int(age)
l = [2.3]
l[10]
except Exception as e:
print(e)
Exception表示所有的異常都按照一種邏輯去處理,但是假如需要不同的異常需要定製不同的處理,就需要使用多分支了,也可以在多分支後面也加入一下Exception,就相當於if…elif…else
但是try中也else,但是和if…else中的截然相反
try:
監測代碼
except Exception:
異常後的邏輯代碼
else:
print('try中代碼塊沒有異常則執行我')
finally:
print('無論一場與否,都會執行我,通常是進行清理工作')
#比如說打開文件然後操作文件導致文件未關閉
斷言
關鍵字assert
def test1():
res = 1
return 1
res1 = test1()
assert res1 == 2
#上面的assert和下面的if一致
if res1 != 2:
raise AttributeError
然而try…except應該少用,因爲他本身就是你附加給你程序的一種異常處理的邏輯,與你的主要工作是沒有關係的,只有在有些一場無法預知的情況下才應該加上try…except,其他邏輯錯誤應該儘量修正