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 ,而非針對 ZeroDivisionError 的 1 。
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 - 字串方法與布林方法會詳細介紹如何定義物件的字串形式。
參考資料
- https://docs.python.org/3/reference/compound_stmts.html#the-try-statement
- https://docs.python.org/3/tutorial/errors.html#handling-exceptions