Python--異常處理

一 .什么是異常

異常就是程序運(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颤霎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌友酱,老刑警劉巖晴音,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缔杉,居然都是意外死亡锤躁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)或详,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)系羞,“玉大人,你說(shuō)我怎么就攤上這事霸琴〗氛瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵梧乘,是天一觀的道長(zhǎng)澎迎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)选调,這世上最難降的妖魔是什么夹供? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮仁堪,結(jié)果婚禮上哮洽,老公的妹妹穿的比我還像新娘。我一直安慰自己弦聂,他們只是感情好鸟辅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著横浑,像睡著了一般剔桨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徙融,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天洒缀,我揣著相機(jī)與錄音,去河邊找鬼欺冀。 笑死树绩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隐轩。 我是一名探鬼主播饺饭,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼职车!你這毒婦竟也來(lái)了瘫俊?” 一聲冷哼從身側(cè)響起鹊杖,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扛芽,沒(méi)想到半個(gè)月后骂蓖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡川尖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年登下,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叮喳。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡被芳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馍悟,到底是詐尸還是另有隱情畔濒,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布赋朦,位于F島的核電站篓冲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宠哄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一嗤攻、第九天 我趴在偏房一處隱蔽的房頂上張望毛嫉。 院中可真熱鬧,春花似錦妇菱、人聲如沸承粤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辛臊。三九已至,卻和暖如春房交,著一層夾襖步出監(jiān)牢的瞬間彻舰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工候味, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刃唤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓白群,卻偏偏與公主長(zhǎng)得像尚胞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帜慢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容