異常就是程序運(yùn)行的時(shí)候出現(xiàn)了報(bào)錯(cuò)(在程序出現(xiàn)錯(cuò)誤的時(shí)候聂使,則會(huì)產(chǎn)生一個(gè)異常奄毡,若程序沒有處理它,則會(huì)拋出該異常固阁,程序運(yùn)行會(huì)終止)
出錯(cuò)類型
1.語法錯(cuò)誤(書寫錯(cuò)誤)
如下面的出錯(cuò)
2.其他類型的出錯(cuò)
# TypeError
for i in 3:
pass
TypeError: 'int' object is not iterable
類型錯(cuò)誤::int類型不可迭代
----------------------------------------------
# ValueError
inp=input(">>: ") # 輸入 qf
int(inp)
ValueError: invalid literal for int() with base 10: 'qf'
值錯(cuò)誤:int不能把字符串轉(zhuǎn)換成整型
-----------------------------------------------
# NameError
aaa
NameError: name 'aaa' is not defined
名字錯(cuò)誤:名字‘a(chǎn)aa’沒有定義
----------------------------------------------
# IndexError
l=['yangge','aa']
l[3]
IndexError: list index out of range
索引錯(cuò)誤:數(shù)列的索引超出了范圍
-----------------------------------------------
# KeyError
dic={'name':'yangge'}
dic['age']
KeyError: 'age'
鍵錯(cuò)誤:沒有這個(gè)鍵
-----------------------------------------------
# AttributeError
class Foo:
pass
Foo.x
AttributeError: type object 'Foo' has no attribute 'x'
屬性錯(cuò)誤:類型對(duì)象‘Foo’沒有屬性‘x’
-----------------------------------------------
# ZeroDivisionError:無法完成計(jì)算
res1=1/0
異常的種類
試圖訪問一個(gè)對(duì)象沒有的屬性负敏,比如foo.x贡茅,但是foo沒有屬性x
AttributeError
輸入/輸出異常;基本上是無法打開文件
IOError
無法導(dǎo)入模塊或包其做;基本上是路徑問題或名稱錯(cuò)誤
ImportError
語法錯(cuò)誤(的子類) 友扰;代碼沒有正確對(duì)齊
IndentationError
下標(biāo)索引超出序列邊界,比如當(dāng) li 只有三個(gè)元素庶柿,卻試圖訪問 li[5]
IndexError
試圖訪問字典里不存在的鍵
KeyError
按了一下 Ctrl+C
KeyboardInterrupt
(鍵盤中斷)使用一個(gè)還未被賦予對(duì)象的變量
NameError
無效語法村怪,語法錯(cuò)誤
SyntaxError
傳入對(duì)象類型不符合要求,如sum 函數(shù)需要的是 int浮庐,但你傳入了 str
TypeError
試圖訪問一個(gè)還未被設(shè)置的局部變量甚负,基本上是由于另有一個(gè)同名的全局變量,導(dǎo)致你以為正在訪問它
UnboundLocalError
例如:
"""
x = 1
def func():
x += 1
return xfunc()
UnboundLocalError: local variable 'x' referenced before assignment
局部變量 x 在賦值之前被引用
"""
- 傳入一個(gè)調(diào)用者不期望的值审残,即使值的類型是正確的梭域,比如 int('a')
ValueError
異常處理
為了保證程序的健壯和容錯(cuò)性,即在遇到錯(cuò)誤的程序時(shí)不會(huì)中斷
1.處理方法
使用try:搅轿,病涨,,璧坟,既穆,except:,雀鹃,幻工,,黎茎,:可以在發(fā)生錯(cuò)誤之后進(jìn)行處理囊颅。
try:
被檢測(cè)到的代碼模塊
except 異常類型:
try中一旦檢測(cè)到的異常,就執(zhí)行職工位置的邏輯
-------------------------------
例子:
def func(arg):
try:
arg +=1
except TypeError as e:
#如果檢測(cè)到類型錯(cuò)誤就把這個(gè)類型錯(cuò)誤命名為e傅瞻;
#并輸出這個(gè)錯(cuò)誤的報(bào)錯(cuò)
print(e)
func('ad') #很明顯這是不能用字符串的
2.異常的處理進(jìn)階
2.1處理單種錯(cuò)誤
def func(arg):
try:
arg +=1
except TypeError as e:
#如果檢測(cè)到類型錯(cuò)誤就把這個(gè)類型錯(cuò)誤命名為e踢代;
#并輸出這個(gè)錯(cuò)誤的報(bào)錯(cuò)
print(e)
func('ad')
2.2處理多種異常
try:
.....
except IndexError as a:
print(a)
except KeyError as a:
print(a)
except ValueError as a:
print(a)
#寫多種異常的判斷
2.3處理全部異常
Exception 可以匹配全部的錯(cuò)誤
x="kja"
try:
int(x)
except Exception as e:
print(e)
2.4其他的異常處理結(jié)構(gòu)
x = 'akldk'
try:
int(x)
except Exception as e:
print(e)
else:
print('try內(nèi)代碼塊沒有異常則執(zhí)行我')
finally:
print('無論異常與否,都會(huì)執(zhí)行該模塊,通常是進(jìn)行清理工作'如關(guān)閉文件、關(guān)閉ssh連接嗅骄、刪除日志等)
異常處理(常用)
import traceback
#這個(gè)模塊可以用來捕獲并打印的所有的異常信息(包括哪里犯了這個(gè)錯(cuò)誤)
#注意上面的沒有使用這個(gè)模塊的只會(huì)打印出是犯了哪種錯(cuò)誤
#而不不知道在哪個(gè)文件哪個(gè)函數(shù)哪一行出錯(cuò)了
print('start-->')
try:
1 + 'a'
except TypeError as e:
print(e)
print('*' * 30)
print(traceback.format_exc()) #這個(gè)可以用來接受全部的報(bào)錯(cuò)
print('*' * 20)
print('end')
traceback.print_exc()跟traceback.format_exc()有什么區(qū)別呢胳挎?
format_exc()返回字符串,print_exc()則直接給打印出來掸读。
即traceback.print_exc()與print traceback.format_exc()效果是一樣的串远。
print_exc()還可以接受file參數(shù)直接寫入到一個(gè)文件。比如
traceback.print_exc(file=open('tb.txt','w+'))
寫入到tb.txt文件去儿惫。