Python 簡易手冊

單元 26 - try 陳述

Python 中可預期的錯誤 (error) 叫做例外 (exception) ,像是存取檔案,檔案不存在之類可以預期的錯誤都被設計成例外類別 (class) ,然後把可能會發起例外的程式碼放到關鍵字 (keyword) try 底下,個別處理的例外交給關鍵字 except 偵測,例如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 對可能會出錯的程式碼例外處理
try:
    # 除數 0 是致命錯誤
    a = 1 / 0
# 處理除數 0 的例外
except ZeroDivisionError:
    a = 1
# 處理任何例外
except:
    a = 0

# 印出變數 a
print(a)

# 檔名: try_demo.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

第 2 行,關鍵字 try 最後要加上冒號,底下縮排部分就是可能會出錯的程式碼

 1
 2
 3
 4
# 對可能會出錯的程式碼例外處理
try:
    # 除數 0 是致命錯誤
    a = 1 / 0

/ 為做除法的算術運算子 (arithmetic operator) 之一,單元 12 - 算術運算子介紹算術運算子的用法。

除數為 0 為程式中的致命錯誤 (fatal error) , Python 直譯器 (interpreter) 偵測到除數為 0 的情況,就會發起 ZeroDivisionError 例外,也就是底下第一個 except 空一格接的例外識別字 (identifier) ,注意最後也是要加上冒號

 5
 6
 7
# 處理除數 0 的例外
except ZeroDivisionError:
    a = 1

以上是如果發生除數為 0 的錯誤,就會把變數 (variable) a 設定為整數 1 ,底下 except 直接加上冒號,這表示處理任何例外

 8
 9
10
# 處理任何例外
except:
    a = 0

所以最後不接任何例外類別的 except: 像是以上皆非的預設選項,這個例子最後印出變數 a 的值,執行結果如下

> python try_demo.py
1
>

這裡要留意 except 的順序,如果 except 直接加上冒號的這一行放在例外類別之前的位置,由於這會直接處理任何發生的例外,因此底下其他的 except 不會執行,像是以上順序是以下這樣的話

  
  
  
  
  
  
  
  
  
  
# 對可能會出錯的程式碼例外處理
try:
    # 除數 0 是致命錯誤
    a = 1 / 0
# 處理任何例外
except:
    a = 0
# 處理除數 0 的例外
except ZeroDivisionError:
    a = 1

那變數 a 會被設定為 0 ,而非針對 ZeroDivisionError1

try-except 最後可以加上 else ,最後沒有發生例外的執行項目,例如將上例加入狀態變數,預設為 False ,如果沒有發生例外就將狀態變數設定為 True ,如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 設定狀態變數
state = False

# 對可能會出錯的程式碼例外處理
try:
    a = 1 / 1
# 處理除數 0 的例外
except ZeroDivisionError:
    a = 1
# 處理任何例外
except:
    a = 0
# 沒有發生例外的執行項目
else:
    state = True

# 印出狀態變數
print(state)

# 檔名: try_demo2.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

此例最後會印出狀態變數,由於沒有發生例外,所以狀態變數會被設定為 True ,執行結果如下

> python try_demo2.py
True
>

try-except 最後可以再加上 finally ,當作例外處理結束後,無論有否發生例外都會執行的項目,例如將上例印出狀態變數移到 finally 的部分,如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 設定狀態變數
state = False

# 對可能會出錯的程式碼例外處理
try:
    a = 1 / 0
# 處理除數 0 的例外
except ZeroDivisionError:
    a = 1
# 處理任何例外
except:
    a = 0
# 沒有發生例外的執行項目
else:
    state = True
# 無論是否發生例外都會執行的項目
finally:
    print(state)

# 檔名: try_demo3.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

此例執行結果如下

> python try_demo3.py
False
>

except 接例外類別之後可以再加上關鍵字 as ,替例外類別取別名,例如再將上例改寫如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 設定狀態變數
state = False

# 對可能會出錯的程式碼例外處理
try:
    a = 1 / 0
# 處理除數 0 的例外
except ZeroDivisionError as e:
    a = 1
    print(e)
# 處理任何例外
except:
    a = 0
# 沒有發生例外的執行項目
else:
    state = True
# 無論是否發生例外都會執行的項目
finally:
    print(state)

# 檔名: try_demo4.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

第 8 行替 ZeroDivisionError 取別名為 e ,並且在底下印出 e 的字串 (string) 形式,此例執行結果如下

> python try_demo4.py
division by zero
False
>

物件 (object) 都有字串形式,單元 57 - 字串方法與布林方法會詳細介紹如何定義物件的字串形式。

參考資料

上一頁 單元 25 - break 陳述
回 Python 簡易手冊 首頁
下一頁 單元 27 - raise 陳述
回 Python 教材首頁
回程式語言教材首頁