python異常處理

異常就是程序運(yùn)行的時(shí)候出現(xiàn)了報(bào)錯(cuò)(在程序出現(xiàn)錯(cuò)誤的時(shí)候聂使,則會(huì)產(chǎn)生一個(gè)異常奄毡,若程序沒有處理它,則會(huì)拋出該異常固阁,程序運(yùn)行會(huì)終止)

image.png

出錯(cuò)類型

1.語法錯(cuò)誤(書寫錯(cuò)誤)
如下面的出錯(cuò)


image.png

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 x

func()

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文件去儿惫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澡罚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肾请,更是在濱河造成了極大的恐慌留搔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铛铁,死亡現(xiàn)場(chǎng)離奇詭異隔显,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饵逐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門括眠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夷家,“玉大人记盒,你說我怎么就攤上這事∈旯澹” “怎么了薄声?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵当船,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我默辨,道長(zhǎng)德频,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任缩幸,我火速辦了婚禮壹置,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘表谊。我一直安慰自己蒸绩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布铃肯。 她就那樣靜靜地躺著患亿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪押逼。 梳的紋絲不亂的頭發(fā)上步藕,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音挑格,去河邊找鬼咙冗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛漂彤,可吹牛的內(nèi)容都是我干的雾消。 我是一名探鬼主播灾搏,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼立润!你這毒婦竟也來了狂窑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤桑腮,失蹤者是張志新(化名)和其女友劉穎泉哈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體破讨,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丛晦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了提陶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烫沙。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隙笆,靈堂內(nèi)的尸體忽然破棺而出斧吐,到底是詐尸還是另有隱情,我是刑警寧澤仲器,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布煤率,位于F島的核電站,受9級(jí)特大地震影響乏冀,放射性物質(zhì)發(fā)生泄漏蝶糯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一辆沦、第九天 我趴在偏房一處隱蔽的房頂上張望昼捍。 院中可真熱鬧,春花似錦肢扯、人聲如沸妒茬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乍钻。三九已至,卻和暖如春铭腕,著一層夾襖步出監(jiān)牢的瞬間银择,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工累舷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浩考,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓被盈,卻偏偏與公主長(zhǎng)得像析孽,于是被迫代替她去往敵國(guó)和親搭伤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355