溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

python 異常處理(25)

發(fā)布時(shí)間:2020-02-24 20:58:11 來(lái)源:網(wǎng)絡(luò) 閱讀:178 作者:qq5d6f345f0205e 欄目:編程語(yǔ)言

在python開(kāi)發(fā)中,代碼書(shū)寫(xiě)時(shí)難免有疏忽或者意向不到的bug,導(dǎo)致程序run的過(guò)程中有可能會(huì)直接崩潰;然后對(duì)于程序猿而言,程序因bug崩潰是家常便飯,為了增加程序的健壯性,防止程序崩潰,我們可以對(duì)程序的有可能發(fā)生崩潰的代碼增加異常處理,以達(dá)到程序穩(wěn)健運(yùn)行的目的。

python 異常處理(25)

?

一.異常的概念

一般情況,python無(wú)法正常處理程序時(shí),就是會(huì)產(chǎn)生異常,舉個(gè)例子:

1.大家都知道分母不能為0,如果分母為0,程序必然崩潰;

1

2

3

x = 3/0

?

程序崩潰/報(bào)錯(cuò):ZeroDivisionError: division by zero

?

2.假如 python文件讀寫(xiě) 中,我們講解了文件的讀寫(xiě)操作,如果我們對(duì)一個(gè)不存在的文件讀取內(nèi)容,程序必然也會(huì)崩潰;

1

2

3

4

# 讀取123.txt文件,實(shí)際上該文件并不存在

fp =open("123.txt","r")

?

程序崩潰/報(bào)錯(cuò):FileNotFoundError: [Errno 2] No such file or directory: '123.txt'

?

對(duì)于以上的各種異常情況,我們可以通過(guò)?try…except…解決,那么具體有哪些異常能捕獲呢?如下所示:

1.BaseException?— 所有異常的基類(lèi)

2.SystemExit?— 解釋器請(qǐng)求退出

3.KeyboardInterrupt?— 用戶(hù)中斷執(zhí)行(通常是輸入^C)

4.Exception?— 常規(guī)錯(cuò)誤的基類(lèi)

5.StopIteration?— 迭代器沒(méi)有更多的值

6.GeneratorExit?— 生成器(generator)發(fā)生異常來(lái)通知退出

7.StandardError?— 所有的內(nèi)建標(biāo)準(zhǔn)異常的基類(lèi)

8.ArithmeticError?— 所有數(shù)值計(jì)算錯(cuò)誤的基類(lèi)

9.FloatingPointError?— 浮點(diǎn)計(jì)算錯(cuò)誤

10.OverflowError?— 數(shù)值運(yùn)算超出最大限制

11.ZeroDivisionError?— 除(或取模)零 (所有數(shù)據(jù)類(lèi)型)

12.AssertionError?— 斷言語(yǔ)句失敗

13.AttributeError?— 對(duì)象沒(méi)有這個(gè)屬性

14.EOFError?— 沒(méi)有內(nèi)建輸入,到達(dá)EOF 標(biāo)記

15.EnvironmentError?— 操作系統(tǒng)錯(cuò)誤的基類(lèi)

16.IOError?— 輸入/輸出操作失敗

17.OSError?— 操作系統(tǒng)錯(cuò)誤

18.WindowsError?— 系統(tǒng)調(diào)用失敗

19.ImportError?— 導(dǎo)入模塊/對(duì)象失敗

20.LookupError?— 無(wú)效數(shù)據(jù)查詢(xún)的基類(lèi)

21.IndexError?— 列中沒(méi)有此索引(index)

22.KeyError?— 映射中沒(méi)有這個(gè)鍵

23.MemoryError?— 內(nèi)存溢出錯(cuò)誤(對(duì)于Python 解釋器不是致命的)

24.NameError?— 未聲明/初始化對(duì)象 (沒(méi)有屬性)

25.UnboundLocalError?— 訪問(wèn)未初始化的本地變量

26.ReferenceError?— 弱引用(Weak reference)試圖訪問(wèn)已經(jīng)垃圾回收了的對(duì)象

27.RuntimeError?— 一般的運(yùn)行時(shí)錯(cuò)誤

28.NotImplementedError?— 尚未實(shí)現(xiàn)的方法

29.SyntaxError?— Python 語(yǔ)法錯(cuò)誤

30.IndentationError?— 縮進(jìn)錯(cuò)誤

31.TabError?—? Tab 和空格混用

32.SystemError?— 一般的解釋器系統(tǒng)錯(cuò)誤

33.TypeError?— 對(duì)類(lèi)型無(wú)效的操作

34.ValueError?— 傳入無(wú)效的參數(shù)

35.UnicodeError?— Unicode 相關(guān)的錯(cuò)誤

36.UnicodeDecodeError?— Unicode 解碼時(shí)的錯(cuò)誤

37.UnicodeEncodeError?— Unicode 編碼時(shí)錯(cuò)誤

38.UnicodeTranslateError?— Unicode 轉(zhuǎn)換時(shí)錯(cuò)誤

39.Warning?— 警告的基類(lèi)

40.DeprecationWarning?— 關(guān)于被棄用的特征的警告

41.FutureWarning?— 關(guān)于構(gòu)造將來(lái)語(yǔ)義會(huì)有改變的警告

42.OverflowWarning?— 舊的關(guān)于自動(dòng)提升為長(zhǎng)整型(long)的警告

43.PendingDeprecationWarning?— 關(guān)于特性將會(huì)被廢棄的警告

44.RuntimeWarning?— 可疑的運(yùn)行時(shí)行為(runtime behavior)的警告

45.SyntaxWarning?— 可疑的語(yǔ)法的警告

46.UserWarning?— 用戶(hù)代碼生成的警告

?

python 異常處理(25)

二.捕獲異常方式

1.捕獲所有異常


1

2

3

4

try:

????<代碼>

except:

????print("異常說(shuō)明")

示例代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# !usr/bin/env python

# -*- coding:utf-8 _*-

"""

@Author:何以解憂(yōu)

@Blog(個(gè)人博客地址): shuopython.com

@WeChat Official Account(微信公眾號(hào)):猿說(shuō)python

@Github:www.github.com

@File:try_except.py

@Time:2019/10/9 21:27

?

@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!

"""

?

try:

????x = 3 / 0 # 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼

????print("hello world")

except:

????print("異常說(shuō)明:分母不能為0")

?

print("程序正常結(jié)束")

輸出結(jié)果:

1

2

異常說(shuō)明:分母不能為0

程序正常結(jié)束

?

2.捕獲指定異常


1

2

3

4

try:

????< 語(yǔ)句 >

except < 異常名 >:

????print('異常說(shuō)明')

示例代碼:

1

2

3

4

5

6

7

8

try:

????fp = open("123.txt","r") # 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼

????print("hello world")

????fp.close()

except IOError:

????print("異常說(shuō)明:文件讀取失敗")

?

print("程序正常結(jié)束")

輸出結(jié)果:

1

2

異常說(shuō)明:文件讀取失敗

程序正常結(jié)束

?

3.捕獲多個(gè)異常


1

2

3

4

5

6

7

8

try:

????< 語(yǔ)句 >

except < 異常名1 >:

????print('異常說(shuō)明1')

except < 異常名2 >:

????print('異常說(shuō)明2')

except < 異常名3 >:

????print('異常說(shuō)明3')

該種異常處理語(yǔ)法的規(guī)則是:

a.執(zhí)行try下的語(yǔ)句,如果引發(fā)異常,則執(zhí)行過(guò)程會(huì)跳到第一個(gè)except語(yǔ)句。

b.如果第一個(gè)except中定義的異常名與引發(fā)的異常匹配,則執(zhí)行該except中的語(yǔ)句。

c.如果引發(fā)的異常不匹配第一個(gè)except,則會(huì)搜索第二個(gè)except,允許編寫(xiě)的except數(shù)量沒(méi)有限制。

d.如果所有的except都不匹配,則異常會(huì)傳遞到下一個(gè)調(diào)用本代碼的最高層try代碼中。

示例代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

try:

????fp = open("123.txt","r") # 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼

????print("hello world")

????fp.close()

except GeneratorExit:

????print("異常說(shuō)明:GeneratorExit")

except FloatingPointError:

????print("異常說(shuō)明:FloatingPointError")

except OverflowError:

????print("異常說(shuō)明:OverflowError")

except ZeroDivisionError:

????print("異常說(shuō)明:ZeroDivisionError")

except IOError:

????print("異常說(shuō)明:IOError")

?

print("程序正常結(jié)束")

輸出結(jié)果:

1

2

異常說(shuō)明:IOError

程序正常結(jié)束

?

4.萬(wàn)能的異常捕獲


1

2

3

4

try:

????< 語(yǔ)句 >

except Exception as e: # 自動(dòng)識(shí)別異常信息,并將異常信息保存在e中

????print('異常說(shuō)明:',e)

示例代碼:

1

2

3

4

5

6

7

8

try:

????fp = open("python.txt","r") # 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼

????print("hello world")

????fp.close()

except Exception as e:

????print("異常說(shuō)明:",e)

?

print("程序正常結(jié)束")

輸出結(jié)果:

1

2

異常說(shuō)明: [Errno 2] No such file or directory: 'python.txt'

程序正常結(jié)束

?

python 異常處理(25)

?

5.異常中的?else

如果判斷完沒(méi)有異常之后還想做其他事,就可以使用下面這樣的else語(yǔ)句,注意:是在try中沒(méi)有異常情況下,才會(huì)執(zhí)行else之后的代碼。

1

2

3

4

5

6

7

8

try:

????< 語(yǔ)句 >

except < 異常名1 >:

????print('異常說(shuō)明1')

except < 異常名2 >:

????print('異常說(shuō)明2')

else:

????< 語(yǔ)句 >??# try語(yǔ)句中沒(méi)有異常則執(zhí)行此段代碼

示例代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

try:

????print("hello world")

except GeneratorExit:

????print("異常說(shuō)明:GeneratorExit")

except FloatingPointError:

????print("異常說(shuō)明:FloatingPointError")

except OverflowError:

????print("異常說(shuō)明:OverflowError")

except ZeroDivisionError:

????print("異常說(shuō)明:ZeroDivisionError")

else:

????print("i love you")

?

print("程序正常結(jié)束")

輸出結(jié)果:

1

2

3

hello world

i love you

程序正常結(jié)束

?

6.異常中的finally

try…finally…語(yǔ)句無(wú)論是否發(fā)生異常都將會(huì)執(zhí)行最后的代碼。

1

2

3

4

try:

????< 語(yǔ)句 >

finally:

????< 語(yǔ)句 >

示例代碼:

1

2

3

4

5

6

7

8

9

10

try:

????fp = open("python.txt","r") # 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼

????print("hello world")

????fp.close()

except Exception as e:

????print("異常說(shuō)明:",e)

finally:

????print("finally") # 無(wú)論是否發(fā)生異常都將會(huì)執(zhí)行最后的代碼

?

print("程序正常結(jié)束")

輸出結(jié)果:

1

2

3

異常說(shuō)明: [Errno 2] No such file or directory: 'python.txt'

finally

程序正常結(jié)束

?

7.raise主動(dòng)觸發(fā)異常

可以使用raise語(yǔ)句自己觸發(fā)異常,語(yǔ)法如下:

1

raise [Exception [, args [, traceback]]]

語(yǔ)句中 Exception 是異常的類(lèi)型(例如,IOError?)參數(shù)標(biāo)準(zhǔn)異常中任一種,args 是自已提供的異常參數(shù)。最后一個(gè)參數(shù)是可選的(在實(shí)踐中很少使用),如果存在,是跟蹤異常對(duì)象;示例代碼如下:

1

2

3

4

5

6

7

try:

????raise Exception("raise Exception!")??# 觸發(fā)異常后,后面的代碼就不會(huì)再執(zhí)行

????print("hello world")

except Exception as e:

????print(e)

finally:

????print("OK")

輸出結(jié)果:

1

2

raise Exception!

OK

python 異常處理(25)

?

四.重點(diǎn)總結(jié)

在python開(kāi)發(fā)中,為了增加程序的健壯性,異常處理try…except…是必須掌握的內(nèi)容.

?

猜你喜歡:

1.python文件讀寫(xiě)操作

2.python內(nèi)置函數(shù)input/eval

?

轉(zhuǎn)載請(qǐng)注明:猿說(shuō)Python???python異常處理


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI