更新於 2024/11/08閱讀時間約 6 分鐘

[Python教學] 中級:異常處理與錯誤處理

Python 中的錯誤處理機制十分靈活,能讓我們捕捉、管理並處理程式中可能出現的各種錯誤和異常情況。本文將深入介紹 Python 中的錯誤處理語法,包括 try-except 結構、raise 用法以及如何自訂例外類別,讓程式更具容錯性和健壯性。

1. 基本錯誤處理:try-except 語句

try-except 是 Python 錯誤處理的基本結構,可以捕捉和處理程式在執行過程中發生的例外。其基本用法如下:

try:
# 嘗試執行的程式碼
result = 10 / 0 # 故意製造錯誤
except ZeroDivisionError:
# 捕捉並處理 ZeroDivisionError 錯誤
print("不能除以零!")

主要組成部分:

  • try:放置可能會發生錯誤的程式碼。如果程式碼執行過程中遇到錯誤,Python 會立即跳至 except 區塊。
  • except:放置錯誤處理的程式碼,指定的錯誤類型可以是 Python 內建的錯誤類型或自訂錯誤類型。若不指定類型,會捕捉所有錯誤。

範例:

try:
value = int(input("請輸入數字:"))
result = 100 / value
print("結果為:", result)
except ZeroDivisionError:
print("發生錯誤:不能除以零")
except ValueError:
print("發生錯誤:輸入值不是有效的數字")

在這個範例中,我們捕捉了兩種可能的錯誤:

  • ZeroDivisionError:當除數為 0 時發生。
  • ValueError:當輸入的值無法轉換為整數時發生。

多重 except 處理

可以在一個 try 區塊內使用多個 except 子句來針對不同的錯誤做出不同的反應。

try:
num = int(input("請輸入數字:"))
result = 10 / num
except ValueError:
print("這不是一個有效的數字!")
except ZeroDivisionError:
print("不能除以零!")
except Exception as e:
print(f"發生未知錯誤:{e}")

Exception 是所有內建錯誤的基類,所以用來捕捉任何未預料的錯誤。


2. 使用 raise 主動引發例外

有時候我們需要在特定情況下主動引發例外,可以使用 raise 關鍵字來達到這個目的。當條件不符或輸入不正確時,主動拋出錯誤能夠讓程式的執行流程更安全。

語法

raise ExceptionType("錯誤訊息")

範例:檢查使用者年齡

def check_age(age):
if age < 0:
raise ValueError("年齡不能為負數")
print(f"你的年齡是:{age}")

try:
user_age = int(input("請輸入年齡:"))
check_age(user_age)
except ValueError as e:
print(f"錯誤:{e}")

在這裡,我們定義了一個 check_age 函數,如果輸入的年齡是負數,則 raise 主動拋出 ValueError 錯誤,並給出自訂錯誤訊息 "年齡不能為負數"。在 try-except 區塊中,我們捕捉到此錯誤並顯示出詳細的錯誤訊息。


3. 自訂例外類別

Python 允許我們自訂例外類別,以便對某些特定情況進行更細緻的錯誤管理。自訂例外類別能讓程式碼的可讀性提高,同時也讓我們可以針對特殊情況撰寫自定義的錯誤訊息或處理流程。

自訂例外的步驟

  1. 建立一個繼承自 Exception 的類別。
  2. 定義 __init__ 方法,用來接受錯誤訊息。
  3. 使用 raise 關鍵字來引發自訂例外。

自訂例外範例:帳戶餘額不足

class InsufficientFundsError(Exception):
def __init__(self, balance, amount):
super().__init__(f"餘額不足:目前餘額 ${balance},但嘗試提取 ${amount}")

def withdraw(balance, amount):
if amount > balance:
raise InsufficientFundsError(balance, amount)
balance -= amount
return balance

try:
account_balance = 1000
withdraw_amount = int(input("請輸入提取金額:"))
new_balance = withdraw(account_balance, withdraw_amount)
print(f"提取成功,新的餘額為:${new_balance}")
except InsufficientFundsError as e:
print(f"錯誤:{e}")

在這個範例中,我們建立了自訂例外類別 InsufficientFundsError,當提取的金額超過帳戶餘額時,便拋出此例外並顯示詳細訊息。這樣可以更加精確地處理特定的錯誤情況。


總結

  • try-except:捕捉並處理程式中可能出現的錯誤。
  • raise:主動引發例外,用於在不滿足特定條件時停止程式執行。
  • 自訂例外:針對特定情況建立自訂例外類別,提高程式碼的可讀性和錯誤處理的靈活性。

藉由掌握這些錯誤處理機制,能讓程式更具健壯性並能更精確地處理各種潛在的錯誤情況。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.