1. 什麼是 Python 的例外?
Python 的例外是一種在程式執行過程中發生的錯誤。通常,程式會從上到下依序執行程式碼,但在特定情況下發生錯誤時,該部分的程式碼會中斷執行,並引發例外。例如,嘗試除以零會產生ZeroDivisionError
,而訪問不存在的列表索引則會產生IndexError
。
1.1 常見的例外類型
Python 提供許多內建的例外。以下是一些常見的例子:
ValueError
: 當函數接收到不適合的值時TypeError
: 當操作或函數對錯誤的資料型別執行時IndexError
: 當嘗試訪問超出序列範圍(如列表)的索引時ZeroDivisionError
: 當嘗試用零進行除法時
這些例外提供有用的診斷資訊,幫助識別程式執行過程中發生的錯誤。
2. 使用try
和except
進行基本的例外處理
在 Python 中,可以使用try
和except
進行例外處理。這樣可以防止程式因錯誤而停止,並確保在發生錯誤時,程式的其他部分仍可繼續執行。
2.1 基本語法
將可能發生錯誤的程式碼放入try
區塊內,然後在except
區塊內編寫處理該錯誤的程式碼。
try: result = 10 / 0 except ZeroDivisionError: print("無法除以零。")
在此例中,當發生ZeroDivisionError
時,會執行except
區塊,並輸出「無法除以零。」
2.2 多個except
區塊
如果需要處理多種類型的例外,可以使用多個except
區塊。例如,可以針對NameError
和TypeError
進行不同的處理。
try: print(a) except NameError: print('變數 a 尚未定義。') except TypeError: print('使用了不正確的資料型別。')
在此程式碼中,因為變數a
未定義,會產生NameError
並顯示相應訊息。
3. 如何處理多個例外
如果程式可能會發生多種類型的例外,可以將它們在同一個except
區塊內進行處理。
3.1 使用單個except
區塊處理多個例外
可以將多個例外類型作為元組傳遞到except
區塊中進行處理,如以下範例所示:
try: num = int(input("請輸入數字: ")) result = 10 / num except (ValueError, ZeroDivisionError): print("輸入無效或嘗試除以零。")
在此例中,如果使用者輸入無效的數值或嘗試用零除法,都會顯示「輸入無效或嘗試除以零。」
3.2 使用父類別處理多個例外
Exception
類別是大多數內建例外的父類別。如果想捕獲所有例外,可以使用該類別。然而,由於此方法範圍廣泛,因此需謹慎使用。
try: # 可能會發生錯誤的程式碼 except Exception as e: print("發生錯誤:", e)
此方法可以捕獲所有例外並顯示訊息。然而,建議優先處理特定例外,以提高程式的可維護性。
4. 觸發例外 (raise
)
在程式執行過程中,如果某些條件不符合,可以手動觸發例外。這可以透過raise
語句實現。
4.1 raise
語句的用法
以下範例顯示當傳入負值時觸發ValueError
:
def check_value(value): if value < 0: raise ValueError("不允許負值。") return value try: result = check_value(-1) except ValueError as e: print(e)
此範例中,因為傳入負值-1
,會觸發ValueError
,並顯示「不允許負值。」
4.2 raise
的應用
raise
語句也可用於自訂例外類別。在特定條件下觸發這些例外,可以讓錯誤處理更具靈活性。
5. 獲取例外資訊
發生例外時,可以獲取詳細的錯誤資訊,以協助診斷問題或進行除錯。可以透過as
語句取得例外物件。
5.1 使用as
語句
以下範例展示如何取得例外物件並顯示其訊息:
try: result = 10 / 0 except ZeroDivisionError as e: print("發生錯誤:", e)
此範例會顯示「發生錯誤: division by zero」,提供錯誤的詳細資訊。
6. 例外處理的最佳實踐
有效的例外處理可以提高程式的穩定性和可靠性。以下是一些 Python 例外處理的最佳實踐:
- 僅捕獲特定例外,避免過於廣泛的例外處理。
- 將錯誤訊息記錄到日誌中,以便後續分析。
- 設計優雅降級機制,確保程式不會完全崩潰。
- 使用
finally
區塊來釋放資源或執行必要操作。
7. 總結
Python 的例外處理是一項關鍵技術,可以提高程式的可靠性,並在錯誤發生時提供適當的應對措施。