課時32:異常處理:你不可能總是對的

那是個好男孩發表於2018-08-21

目錄:

  一、什麼是異常?

  二、異常的總結

  三、課時32課後習題及答案

 

*******************

一、什麼是異常?

*******************

程式出現邏輯錯誤或者使用者輸入不合法都會引起異常,但這些異常並不是致命的,不會導致程式崩潰死掉。可以利用Python提供的異常處理機制,在異常出現的時候及時捕獲,並從內部消化掉。

那麼什麼是異常呢?舉個例子:

file_name = input("請輸入要開啟的檔名:")
f = open(file_name,`r`)
print("檔案的內容是:")

for each_line in f:
      print(each_line)

這裡當然假設使用者輸入的是正確的,但只要使用者輸入一個不存在的檔名,那麼上面的程式碼就不堪一擊:

請輸入要開啟的檔名:我為什麼是一個文件.txt
Traceback (most recent call last):
  File "C:Users14158Desktoplalallalalal.py", line 2, in <module>
    f = open(file_name,`r`)
FileNotFoundError: [Errno 2] No such file or directory: `我為什麼是一個文件.txt`

 上面的例子就丟擲了一個FileNotFoundError的異常,那麼Python通常還可以丟擲哪些異常呢?這裡給大家做總結,今後遇到這些異常就不會陌生了。

 

******************

二、異常的總結

******************

 1、AssertionError:斷言語句(assert)失敗

大家還記得斷言語句吧?在關於分支和迴圈的章節裡講過。當assert這個關鍵字後邊的條件為假的時候,程式將停止並丟擲AssertionError異常。assert語句一般是在測試程式的時候用於在程式碼中置入檢查點:

>>> my_list = ["小甲魚"]
>>> assert len(my_list) > 0
>>> my_list.pop()
`小甲魚`
>>> assert len(my_list) > 0
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    assert len(my_list) > 0
AssertionError

 

2、AttributeError:嘗試訪問未知的物件屬性

>>> my_list = []
>>> my_list.fishc
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    my_list.fishc
AttributeError: `list` object has no attribute `fishc`

 

3、IndexError:索引超出序列的範圍

>>> my_list = [1,2,3]
>>> my_list[3]
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    my_list[3]
IndexError: list index out of range

 

4、KeyError:字典中查詢一個不存在的關鍵字

>>> my_dict = {"one":1,"two":2,"three":3}
>>> my_dict["one"]
1
>>> my_dict["four"]
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    my_dict["four"]
KeyError: `four`

 

5、NameError:嘗試訪問一個不存在的變數

當嘗試訪問一個不存在的變數時,Python會丟擲NameError異常:

>>> fishc
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    fishc
NameError: name `fishc` is not defined

 

6、OSError:作業系統產生的異常

OSError顧名思義就是作業系統產生的異常,像開啟一個不存在的檔案會引發FileNotFoundError,而這個FileNotFoundError就是OSError的子類。例子上面已經演示過,這裡就不重複了。

 

7、SyntaxError:Python語法錯誤

如果遇到SyntaxError是Python語法的錯誤,這時Python的程式碼並不能繼續執行,你應該先找到並改正錯誤:

>>> print "I love fishc.com"
SyntaxError: Missing parentheses in call to `print`. Did you mean print("I love fishc.com")?

 

8、TypeError:不同型別間的無效操作

有些型別不同是不能相互進行計算的,否則會丟擲TypeError異常:

>>> 1 + "1"
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    1 + "1"
TypeError: unsupported operand type(s) for +: `int` and `str`

 

9、ZeroDivisionError:除數為零

地球人都知道除數不能為零,所以除以零就會引發ZeroDivisionError異常:

>>> 5/0
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    5/0
ZeroDivisionError: division by zero

 

我們知道了這些異常,那如何捕獲這些異常呢?

捕獲異常可以用try語句實現,任何出現在try語句範圍內的異常都會被及時捕獲到。try語句有兩種實現形式:一種是 try-except,另一種是try-finally。

 

*******************************

三、課時32課後習題及答案

*******************************