python 異常處理(25)

在python開發中,代碼書寫時不免有疏忽或者意向不到的bug,致使程序run的過程當中有可能會直接崩潰;而後對於程序猿而言,程序因bug崩潰是屢見不鮮,爲了增長程序的健壯性,防止程序崩潰,咱們能夠對程序的有可能發生崩潰的代碼增長異常處理,以達到程序穩健運行的目的。python

bug

 

一.異常的概念

通常狀況,python沒法正常處理程序時,就是會產生異常,舉個例子:git

1.你們都知道分母不能爲0,若是分母爲0,程序必然崩潰;github

1微信

2ide

3函數

x = 3/0編碼

 

程序崩潰/報錯:ZeroDivisionError: division by zerospa

 

2.假如 python文件讀寫 中,咱們講解了文件的讀寫操做,若是咱們對一個不存在的文件讀取內容,程序必然也會崩潰;操作系統

1code

2

3

4

# 讀取123.txt文件,實際上該文件並不存在

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

 

程序崩潰/報錯:FileNotFoundError: [Errno 2] No such file or directory: '123.txt'

 

對於以上的各類異常狀況,咱們能夠經過 try…except…解決,那麼具體有哪些異常能捕獲呢?以下所示:

1.BaseException — 全部異常的基類

2.SystemExit — 解釋器請求退出

3.KeyboardInterrupt — 用戶中斷執行(一般是輸入^C)

4.Exception — 常規錯誤的基類

5.StopIteration — 迭代器沒有更多的值

6.GeneratorExit — 生成器(generator)發生異常來通知退出

7.StandardError — 全部的內建標準異常的基類

8.ArithmeticError — 全部數值計算錯誤的基類

9.FloatingPointError — 浮點計算錯誤

10.OverflowError — 數值運算超出最大限制

11.ZeroDivisionError — 除(或取模)零 (全部數據類型)

12.AssertionError — 斷言語句失敗

13.AttributeError — 對象沒有這個屬性

14.EOFError — 沒有內建輸入,到達EOF 標記

15.EnvironmentError — 操做系統錯誤的基類

16.IOError — 輸入/輸出操做失敗

17.OSError — 操做系統錯誤

18.WindowsError — 系統調用失敗

19.ImportError — 導入模塊/對象失敗

20.LookupError — 無效數據查詢的基類

21.IndexError — 列中沒有此索引(index)

22.KeyError — 映射中沒有這個鍵

23.MemoryError — 內存溢出錯誤(對於Python 解釋器不是致命的)

24.NameError — 未聲明/初始化對象 (沒有屬性)

25.UnboundLocalError — 訪問未初始化的本地變量

26.ReferenceError — 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象

27.RuntimeError — 通常的運行時錯誤

28.NotImplementedError — 還沒有實現的方法

29.SyntaxError — Python 語法錯誤

30.IndentationError — 縮進錯誤

31.TabError —  Tab 和空格混用

32.SystemError — 通常的解釋器系統錯誤

33.TypeError — 對類型無效的操做

34.ValueError — 傳入無效的參數

35.UnicodeError — Unicode 相關的錯誤

36.UnicodeDecodeError — Unicode 解碼時的錯誤

37.UnicodeEncodeError — Unicode 編碼時錯誤

38.UnicodeTranslateError — Unicode 轉換時錯誤

39.Warning — 警告的基類

40.DeprecationWarning — 關於被棄用的特徵的警告

41.FutureWarning — 關於構造未來語義會有改變的警告

42.OverflowWarning — 舊的關於自動提高爲長整型(long)的警告

43.PendingDeprecationWarning — 關於特性將會被廢棄的警告

44.RuntimeWarning — 可疑的運行時行爲(runtime behavior)的警告

45.SyntaxWarning — 可疑的語法的警告

46.UserWarning — 用戶代碼生成的警告

 

bug

二.捕獲異常方式

1.捕獲全部異常


1

2

3

4

try:

    <代碼>

except:

    print("異常說明")

示例代碼:

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:何以解憂

@Blog(我的博客地址): shuopython.com

@WeChat Official Account(微信公衆號):猿說python

@Github:www.github.com

@File:try_except.py

@Time:2019/10/9 21:27

 

@Motto:不積跬步無以致千里,不積小流無以成江海,程序人生的精彩須要堅持不懈地積累!

"""

 

try:

    x = 3 / 0 # 程序出現異常,不會繼續執行後面的代碼

    print("hello world")

except:

    print("異常說明:分母不能爲0")

 

print("程序正常結束")

輸出結果:

1

2

異常說明:分母不能爲0

程序正常結束

 

2.捕獲指定異常


1

2

3

4

try:

    < 語句 >

except < 異常名 >:

    print('異常說明')

示例代碼:

1

2

3

4

5

6

7

8

try:

    fp = open("123.txt","r") # 程序出現異常,不會繼續執行後面的代碼

    print("hello world")

    fp.close()

except IOError:

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

 

print("程序正常結束")

輸出結果:

1

2

異常說明:文件讀取失敗

程序正常結束

 

3.捕獲多個異常


1

2

3

4

5

6

7

8

try:

    < 語句 >

except < 異常名1 >:

    print('異常說明1')

except < 異常名2 >:

    print('異常說明2')

except < 異常名3 >:

    print('異常說明3')

該種異常處理語法的規則是:

a.執行try下的語句,若是引起異常,則執行過程會跳到第一個except語句。

b.若是第一個except中定義的異常名與引起的異常匹配,則執行該except中的語句。

c.若是引起的異常不匹配第一個except,則會搜索第二個except,容許編寫的except數量沒有限制。

d.若是全部的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。

示例代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

try:

    fp = open("123.txt","r") # 程序出現異常,不會繼續執行後面的代碼

    print("hello world")

    fp.close()

except GeneratorExit:

    print("異常說明:GeneratorExit")

except FloatingPointError:

    print("異常說明:FloatingPointError")

except OverflowError:

    print("異常說明:OverflowError")

except ZeroDivisionError:

    print("異常說明:ZeroDivisionError")

except IOError:

    print("異常說明:IOError")

 

print("程序正常結束")

輸出結果:

1

2

異常說明:IOError

程序正常結束

 

4.萬能的異常捕獲


1

2

3

4

try:

    < 語句 >

except Exception as e: # 自動識別異常信息,並將異常信息保存在e中

    print('異常說明:',e)

示例代碼:

1

2

3

4

5

6

7

8

try:

    fp = open("python.txt","r") # 程序出現異常,不會繼續執行後面的代碼

    print("hello world")

    fp.close()

except Exception as e:

    print("異常說明:",e)

 

print("程序正常結束")

輸出結果:

1

2

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

程序正常結束

 

異常

 

5.異常中的 else

若是判斷完沒有異常以後還想作其餘事,就可使用下面這樣的else語句,注意:是在try中沒有異常狀況下,纔會執行else以後的代碼。

1

2

3

4

5

6

7

8

try:

    < 語句 >

except < 異常名1 >:

    print('異常說明1')

except < 異常名2 >:

    print('異常說明2')

else:

    < 語句 >  # try語句中沒有異常則執行此段代碼

示例代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

try:

    print("hello world")

except GeneratorExit:

    print("異常說明:GeneratorExit")

except FloatingPointError:

    print("異常說明:FloatingPointError")

except OverflowError:

    print("異常說明:OverflowError")

except ZeroDivisionError:

    print("異常說明:ZeroDivisionError")

else:

    print("i love you")

 

print("程序正常結束")

輸出結果:

1

2

3

hello world

i love you

程序正常結束

 

6.異常中的finally

try…finally…語句不管是否發生異常都將會執行最後的代碼。

1

2

3

4

try:

    < 語句 >

finally:

    < 語句 >

示例代碼:

1

2

3

4

5

6

7

8

9

10

try:

    fp = open("python.txt","r") # 程序出現異常,不會繼續執行後面的代碼

    print("hello world")

    fp.close()

except Exception as e:

    print("異常說明:",e)

finally:

    print("finally") # 不管是否發生異常都將會執行最後的代碼

 

print("程序正常結束")

輸出結果:

1

2

3

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

finally

程序正常結束

 

7.raise主動觸發異常

可使用raise語句本身觸發異常,語法以下:

1

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

語句中 Exception 是異常的類型(例如,IOError )參數標準異常中任一種,args 是自已提供的異常參數。最後一個參數是可選的(在實踐中不多使用),若是存在,是跟蹤異常對象;示例代碼以下:

1

2

3

4

5

6

7

try:

    raise Exception("raise Exception!")  # 觸發異常後,後面的代碼就不會再執行

    print("hello world")

except Exception as e:

    print(e)

finally:

    print("OK")

輸出結果:

1

2

raise Exception!

OK

摳鼻子

 

四.重點總結

在python開發中,爲了增長程序的健壯性,異常處理try…except…是必須掌握的內容.

 

猜你喜歡:

1.python文件讀寫操做

2.python內置函數input/eval

 

轉載請註明猿說Python » python異常處理

相關文章
相關標籤/搜索