Python 速查手冊

4.13 複合陳述 try except finally else

例外處理 (exception handling) 是利用 tryexceptfinallyelse 構成的複合陳述 (statement) ,所謂例外 (exception) 是指已知有可能發生的錯誤 (error) ,像是開啟檔案,檔案卻不存在,或除數為 0 等等的情況。所有可能發生例外的程式碼 (code) 都要放在 try 底下的程式區塊 (block) , except 後空一格接例外類別 (class) ,底下程式區塊做相對應的例外處理,而 else 的部分則是假設沒有例外發生的處理,最後 finally 是例外處理結束後,無論如何都會執行的部分。

除數為 0 是種已知錯誤,這錯誤可由內建的例外類別 ZeroDivisionError 偵測到,所有內建例外類別都繼承自 BaseException 類別,這邊可以看到當除數為 0 的例外發生後,直譯器 (interpreter) 就會跳到 except ZeroDivisionError 的部分將變數 (variable) a 設定為整數 0 ,注意 tryexcept 最後都要加上分號

try:
    a = 1 / 0
except ZeroDivisionError:
    a = 0
    
print(a)

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:try01.py
# 功能:示範 try 陳述
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 try01.py
0
$

如果要處理沒有列舉出的例外,就要在 try 底下放一個不接任何例外的 except ,這個例子是用 raise 發起 Exception 例外,由於不是 ZeroDivisionError ,因此變數 a 被設定為整數 2

try:
    a = 1 / 1
    raise Exception
except ZeroDivisionError:
    a = 0
except:
    a = -1
    
print(a)

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:try02.py
# 功能:示範 try 陳述
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 try02.py
-1
$

try-except 底下可以放 else 陳述, else 處理例外沒有發生的情況, else 可有可無,此例 1 除以 1 不會發生例外,因此變數 m 被設定為字串 (string) "Good!"

try:
    a = 1 / 1
except:
    a = 0
else:
    m = "Good!"

print(a)
print(m)

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:try03.py
# 功能:示範 try 陳述
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 try03.py
1.0
Good!
$

finally 放在 try-except 複合陳述最底下的部分,這部分同樣可有可無, finally 是例外處理結束後一定會執行的部分,此例也可以看到當例外發生後, else 的部分不會執行,因此變數 m 並沒有被設定

m = "Something happened."
try:
    a = 1 / 0
except:
    a = 0
else:
    m = "Good!"
finally:
    print("Everything is done.")

print(a)
print(m)

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:try04.py
# 功能:示範 try 陳述
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 try04.py
"Everything is done."
0
Something happened.
$

上一頁: 4.12 複合陳述 while else
Python 速查手冊 - 目錄
下一頁: 4.14 複合陳述 with as
回 Python 教材首頁