Python: 錯誤處理與異常(Error Handling and Exceptions)
在 Python 中,錯誤處理和異常是用來管理程序執行過程中發生的錯誤或意外情況的機制。
這使得程序能夠在遇到問題時不會崩潰,而是能夠進行適當的處理或回應。
異常是指在程序執行過程中發生的意外事件,這些事件會導致程序的正常執行被中斷。
當 Python 遇到異常時,會引發一個異常對象,這個對象包含了錯誤的類型和相關信息。
Python 常見例外類型
異常是指在程序執行過程中發生的意外事件,通常會導致程序的正常執行被中斷。
常見的異常類型包括:
def infinite_recursion():
return infinite_recursion() # 沒有終止條件
infinite_recursion() # 這裡會引發 RecursionError
- def deep_recursion(n):
if n == 0:
return
else:
deep_recursion(n - 1) # 遞歸調用
deep_recursion(10000) # 如果超過最大遞歸深度,會引發 RecursionError
try:
# 嘗試執行的代碼
result = 10 / 0 # 這將引發 ZeroDivisionError
except ZeroDivisionError:
# 異常處理代碼
print("不能除以零!")
在這個例子中,當執行 10 / 0 時,會引發 ZeroDivisionError,控制權會轉移到 except 區塊,從而避免程序崩潰。
在 Python 中,LBYE(Look Before You Leap)和
EAFP(Easier to Ask for Forgiveness than Permission)是兩種不同的編程風格或錯誤處理策略。
def get_item_from_list(my_list, index):
if index < len(my_list): # 檢查索引是否在範圍內
return my_list[index]
else:
return None # 或者引發異常
在這個例子中,函數在訪問列表的元素之前,先檢查索引是否有效。
def get_item_from_list(my_list, index):
try:
return my_list[index] # 嘗試直接訪問列表元素
except IndexError:
return None # 異常處理
在這個例子中,函數嘗試直接訪問列表的元素,如果索引無效,則捕獲 IndexError 異常並進行處理。
LBYE:在執行操作之前進行檢查,以確保條件滿足,從而避免錯誤。
EAFP:直接執行操作,並在發生錯誤時進行異常處理,這樣的方式在 Python 中更常見,因為它與 Python 的設計哲學相符。
這兩種方法各有優缺點,選擇哪一種取決於具體的情況和需求。
Python 提供了 try、except、else 和 finally 語句來處理異常。
try:
# 嘗試執行的代碼
result = 10 / 0 # 這將引發 ZeroDivisionError
except ZeroDivisionError:
# 異常處理代碼
print("不能除以零!")
else:
# 如果沒有異常發生,執行這部分
print("計算結果:", result)
finally:
# 無論是否發生異常,這部分都會執行
print("執行完畢。")
各部分的作用
在 Python 中,可以使用 raise 語句來拋出異常,並在回調函數中捕獲和處理這些異常。它允許你創建自定義的異常,或者引發內置的異常類型。
def divide(a, b):
if b == 0:
raise ZeroDivisionError("Cannot divide by zero")
return a / b
try:
result = divide(10, 0)
except ZeroDivisionError as e:
print(e)
在這個例子中,如果 b 為 0,divide 函數會主動拋出 ZeroDivisionError 異常。在 try-except 塊中,我們捕獲並處理了這個異常。
使用 raise 語句可以幫助你在代碼中更好地處理錯誤情況,提高程序的健壯性和可維護性。