Python - 引發例外

你好,有抱負的Pythonista!今天,我們將深入Python中引發例外的精彩世界。如果你是编程新手,不用擔心 - 我會一步一步引導你理解這個概念,就像我過去幾年教學中對無數學生所做的那樣。所以,拿起你最喜欢的飲料,讓我們一起踏上這次Python冒險之旅吧!

Python - Raising Exceptions

在Python中引發例外

想象一下,當你正在烹飪一道美味的佳肴時,突然發現你缺少了一種關鍵的食材。你會怎麼辦?你可能會停止烹飪並通知所有人有問題發生了,對嗎?這正是Python中引發例外的含義 - 這是一種標記你的代碼中發生了意料之外的或問題情況的方式。

為什麼要引發例外?

引發例外可以讓我們:

  1. 指示錯誤或異常情況
  2. 控制我們程序的流程
  3. 向用戶或其他代碼部分提供有意義的反饋

讓我們從一個簡單的例子開始:

def divide(a, b):
if b == 0:
raise ValueError("不能除以零!")
return a / b

try:
result = divide(10, 0)
except ValueError as e:
print(f"糟糕!發生了一個錯誤:{e}")

在這個例子中,當有人試圖除以零時,我們引發了一個ValueError。讓我們來解析一下:

  1. 我們定義了一個函數divide(a, b),它檢查b是否為零。
  2. 如果b是零,我們引發一個帶有自定義消息的ValueError
  3. 我們使用try-except塊來捕獲例外並打印一個友好的消息。

當你運行這段代碼時,你會看到:

糟糕!發生了一個錯誤:不能除以零!

引發內置例外

Python帶有一系列我們可以引發的內置例外。以下是一些常見的例外:

例外 描述
ValueError 當函數收到正確類型但不恰當值的參數時引發
TypeError 當對不恰當類型的對象應用操作或函數時引發
IndexError 當序列下標超出範圍時引發
KeyError 當字典鍵未找到時引發
FileNotFoundError 當請求的文件或目錄不存在時引發

讓我們看看一些例子:

def check_age(age):
if not isinstance(age, int):
raise TypeError("年齡必須是整數")
if age < 0:
raise ValueError("年齡不能為負")
print(f"你的年齡是 {age}")

try:
check_age("二十")
except TypeError as e:
print(f"類型錯誤:{e}")

try:
check_age(-5)
except ValueError as e:
print(f"值錯誤:{e}")

當你運行這段代碼時,你會看到:

類型錯誤:年齡必須是整數
值錯誤:年齡不能為負

引發自定義例外

有時候,內置的例外並不符合需求。這就是我們創建自己的自定義例外的時候!這就像一個廚師創造自己獨特的食譜一樣。

創建自定義例外

要創建自定義例外,我們只需定義一個從Exception類繼承的新類:

class TooManyPizzasError(Exception):
pass

def order_pizza(number):
if number > 100:
raise TooManyPizzasError("哇!這麼多披薩無法處理!")
print(f"訂單確認:{number} 個披薩")

try:
order_pizza(101)
except TooManyPizzasError as e:
print(f"訂單失敗:{e}")

在這個美味的例子中:

  1. 我們定義了一個自定義例外TooManyPizzasError
  2. 我們的order_pizza函數在有人訂購超過100個披薩時引發此例外。
  3. 我們捕獲例外並打印一個友好的消息。

當你運行這段代碼時,你會看到:

訂單失敗:哇!這麼多披薩無法處理!

再次引發例外

有時,你可能想要捕獲一個例外,對其進行處理,然後再次引發讓其他人處理。這就像在一場遊戲中傳遞熱馬鈴薯一樣!

以下是如何做到這一點:

def risky_operation():
print("開始危險操作...")
raise ValueError("出現了問題!")

def perform_operation():
try:
risky_operation()
except ValueError:
print("捕獲錯誤,正在記錄...")
raise  # 再次引發例外

try:
perform_operation()
except ValueError as e:
print(f"操作失敗:{e}")

在這個例子中:

  1. risky_operation()總是引發一個ValueError
  2. perform_operation()捕獲例外,記錄它,然後再次引發。
  3. 我們在 外部try-except塊中捕獲重新引發的例外。

當你運行這段代碼時,你會看到:

開始危險操作...
捕獲錯誤,正在記錄...
操作失敗:出現了問題!

就這樣,各位!我們已經涵蓋了引發例外、內置例外、自定義例外,甚至再次引發例外。請記住,例外不是你的敵人 - 它們是幫助你编写健壯且具有錯誤抵抗力的代碼的有價值工具。

就像我總是告訴我的學生那樣,編程就像學習騎自行車。你可能會摔倒幾次,但每次跌倒(或例外)都會教你一些新的東西。保持練習,保持好奇心,並不要害怕在途中引發一些例外!

編程愉快,願你的例外永遠是故意為之的!?✨

Credits: Image by storyset