.

iT邦幫忙

1

Python 錯誤處理與異常(Error Handling and Exceptions)

  • 分享至 

  • xImage
  •  

Python: 錯誤處理與異常(Error Handling and Exceptions)
在 Python 中,錯誤處理和異常是用來管理程序執行過程中發生的錯誤或意外情況的機制。
這使得程序能夠在遇到問題時不會崩潰,而是能夠進行適當的處理或回應。

異常(Exceptions)是什麼?

異常是指在程序執行過程中發生的意外事件,這些事件會導致程序的正常執行被中斷。
當 Python 遇到異常時,會引發一個異常對象,這個對象包含了錯誤的類型和相關信息。

異常的類型

Python 常見例外類型
異常是指在程序執行過程中發生的意外事件,通常會導致程序的正常執行被中斷。
常見的異常類型包括:

  • SyntaxError:語法錯誤。
  • TypeError:數據類型不匹配。
  • ValueError:傳入的參數值不正確。
  • IndexError:索引list超出序列的範圍。
  • KeyError:字典dist中不存在該鍵。
  • ZeroDivisionError:除以零的錯誤。
  • RecursionError:當一個函數的遞歸調用層數超過了 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
    
  • NameError :
    • 使用一個未被定義或不在當前作用域中的變數或是
    • 變數名稱拼寫錯誤
    • 當變數在某個作用域內定義,但在另一個作用域中使用時,會引發 NameError。
  • FileNotFoundError:當你嘗試訪問一個不存在的檔案或目錄時,會引發這個異常。

異常的處理通常使用 try 和 except 語句來進行:

try:
    # 嘗試執行的代碼
    result = 10 / 0  # 這將引發 ZeroDivisionError
except ZeroDivisionError:
    # 異常處理代碼
    print("不能除以零!")

在這個例子中,當執行 10 / 0 時,會引發 ZeroDivisionError,控制權會轉移到 except 區塊,從而避免程序崩潰。

LBYE & EAFP

在 Python 中,LBYE(Look Before You Leap)和
EAFP(Easier to Ask for Forgiveness than Permission)是兩種不同的編程風格或錯誤處理策略。

  1. LBYE(Look Before You Leap)
    LBYE 是指在執行某個操作之前,先檢查條件是否滿足。這種方法強調在執行之前進行檢查,以避免潛在的錯誤。
def get_item_from_list(my_list, index):
    if index < len(my_list):  # 檢查索引是否在範圍內
        return my_list[index]
    else:
        return None  # 或者引發異常

在這個例子中,函數在訪問列表的元素之前,先檢查索引是否有效。

  1. EAFP(Easier to Ask for Forgiveness than Permission)
    EAFP 是指直接嘗試執行某個操作,如果出現錯誤,再進行異常處理。這種方法強調在遇到問題時進行處理,而不是事先檢查。
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("執行完畢。")

各部分的作用

  1. try:包含可能引發異常的代碼。如果發生異常,控制權將轉移到相應的 except 區塊。
  2. except:用於捕獲和處理特定的異常。可以有多個 except 區塊來處理不同類型的異常。
  3. else:如果 try 區塊中的代碼沒有引發異常,則執行 else 區塊中的代碼。
  4. finally:無論是否發生異常,這部分都會被執行,通常用於釋放資源或進行清理工作。

raise

在 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 語句可以幫助你在代碼中更好地處理錯誤情況,提高程序的健壯性和可維護性。


圖片
  直播研討會

尚未有邦友留言

立即登入留言