Python - 引發例外
你好,有抱負的Pythonista!今天,我們將深入Python中引發例外的精彩世界。如果你是编程新手,不用擔心 - 我會一步一步引導你理解這個概念,就像我過去幾年教學中對無數學生所做的那樣。所以,拿起你最喜欢的飲料,讓我們一起踏上這次Python冒險之旅吧!
在Python中引發例外
想象一下,當你正在烹飪一道美味的佳肴時,突然發現你缺少了一種關鍵的食材。你會怎麼辦?你可能會停止烹飪並通知所有人有問題發生了,對嗎?這正是Python中引發例外的含義 - 這是一種標記你的代碼中發生了意料之外的或問題情況的方式。
為什麼要引發例外?
引發例外可以讓我們:
- 指示錯誤或異常情況
- 控制我們程序的流程
- 向用戶或其他代碼部分提供有意義的反饋
讓我們從一個簡單的例子開始:
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
。讓我們來解析一下:
- 我們定義了一個函數
divide(a, b)
,它檢查b
是否為零。 - 如果
b
是零,我們引發一個帶有自定義消息的ValueError
。 - 我們使用
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}")
在這個美味的例子中:
- 我們定義了一個自定義例外
TooManyPizzasError
。 - 我們的
order_pizza
函數在有人訂購超過100個披薩時引發此例外。 - 我們捕獲例外並打印一個友好的消息。
當你運行這段代碼時,你會看到:
訂單失敗:哇!這麼多披薩無法處理!
再次引發例外
有時,你可能想要捕獲一個例外,對其進行處理,然後再次引發讓其他人處理。這就像在一場遊戲中傳遞熱馬鈴薯一樣!
以下是如何做到這一點:
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}")
在這個例子中:
-
risky_operation()
總是引發一個ValueError
。 -
perform_operation()
捕獲例外,記錄它,然後再次引發。 - 我們在 外部
try-except
塊中捕獲重新引發的例外。
當你運行這段代碼時,你會看到:
開始危險操作...
捕獲錯誤,正在記錄...
操作失敗:出現了問題!
就這樣,各位!我們已經涵蓋了引發例外、內置例外、自定義例外,甚至再次引發例外。請記住,例外不是你的敵人 - 它們是幫助你编写健壯且具有錯誤抵抗力的代碼的有價值工具。
就像我總是告訴我的學生那樣,編程就像學習騎自行車。你可能會摔倒幾次,但每次跌倒(或例外)都會教你一些新的東西。保持練習,保持好奇心,並不要害怕在途中引發一些例外!
編程愉快,願你的例外永遠是故意為之的!?✨
Credits: Image by storyset