Python - 錯誤處理
你好,未來的 Python 魔術師們!我很高興能成為你在這個令人興奮的 Python 錯誤處理世界之旅中的導遊。作為一個教程序設計多年的老師,我告訴你,理解錯誤就像學習騎自行車帶訓練輪一樣 - 一開始可能會覺得複雜,但一旦你掌握了它,你將會很快地騎得非常順暢!
錯誤是什麼?
在我們深入之前,先從基礎開始。想像你正在烤蛋糕(跟著我想像,我保證這和 Python 有關!)。你有你的食譜(你的代碼),你的材料(你的數據),你準備好了。但是如果你做到一半時發現雞蛋不夠了呢?那在烘焙世界裡就是一個錯誤!
在 Python 中,錯誤是在程序執行期間發生的錯誤。它就像一個紅色旗幟一樣突然出現,說:“等等!有點不對勁!”
讓我們看看一個簡單的例子:
print(10 / 0)
如果你運行這段代碼,Python 將會引發一個 ZeroDivisionError
。它在說:“嘿,你不能除以零!在我的廚房…我的意思是,編程環境裡是不允許的!”
Python 中的錯誤處理
現在我們知道了錯誤是什麼,讓我們學習如何優雅地處理它們。在 Python 中,我們使用 try
和 except
塊來捕獲和處理錯誤。
這裡是基本的結構:
try:
# 可能引發錯誤的代碼
except 錯誤類型:
# 處理錯誤的代碼
讓我們修改我們之前的例子:
try:
結果 = 10 / 0
print(結果)
except ZeroDivisionError:
print("糟糕!你不能除以零。")
當你運行這段代碼時,它不會崩潰,而是會打印:“糟糕!你不能除以零。”
沒有指定錯誤的 except 子句
有時候,你可能想要捕獲發生的任何錯誤。在這種情況下,你可以使用一個沒有指定錯誤類型的 except
子句:
try:
# 一些危險的代碼
x = int(input("輸入一個數字:"))
y = 10 / x
print(y)
except:
print("出了點問題!")
這將會捕獲 try
塊中發生的任何錯誤。然而,通常更好的是捕獲特定的錯誤,因為這會使你的代碼更精確,更容易調試。
帶有多個錯誤的 except 子句
你也可以在一個 except
子句中處理多個錯誤:
try:
x = int(input("輸入一個數字:"))
y = 10 / x
print(y)
except (ValueError, ZeroDivisionError):
print("無效輸入或除以零!")
這段代碼將會捕獲 ValueError
(如果用戶輸入非數值)和 ZeroDivisionError
。
try-finally 子句
finally
子句用於無論是否發生錯誤都必須執行的代碼。它就像派對後的清理隊伍 - 不論派對如何,它總是會出現!
try:
f = open("example.txt", "r")
# 在文件上進行一些操作
except FileNotFoundError:
print("文件不存在!")
finally:
f.close() # 這將總是執行,即使發生錯誤
錯誤的參數
錯誤可以攜帶額外的信息。你可以在你的 except
塊中訪問這些信息:
try:
x = 10 / 0
except ZeroDivisionError as e:
print(f"發生了一個錯誤:{e}")
這將會打印:“發生了一個錯誤:除以零”
引發錯誤
有時候,你可能想要自己引發一個錯誤。這就像比賽中的裁判員吹哨呼叫犯規一樣:
def check_age(age):
if age < 0:
raise ValueError("年齡不能為負!")
print(f"你的年齡是 {age}")
try:
check_age(-5)
except ValueError as e:
print(e)
這將會打印:“年齡不能為負!”
用戶定義的錯誤
你也可以創建自己的錯誤類型。這就像在遊戲中發明一個新規則:
class TooManyPizzasError(Exception):
pass
def order_pizza(number):
if number > 100:
raise TooManyPizzasError("你不能訂購超過100個披薩!")
print(f"{number} 個披薩訂購成功。")
try:
order_pizza(101)
except TooManyPizzasError as e:
print(e)
Python 中的斷言
斷言是一種確保某些條件被滿足的方法。它們就像代碼中的小檢查點:
def divide(a, b):
assert b != 0, "除數不能為零!"
return a / b
try:
結果 = divide(10, 0)
except AssertionError as e:
print(e)
這將會打印:“除數不能為零!”
標準錯誤
Python 提供了一套內置的錯誤。以下是一些最常見的:
錯誤名稱 | 描述 |
---|---|
ZeroDivisionError | 當除以零或模數運算時引發 |
ValueError | 當函數獲得正確類型但錯誤值的參數時引發 |
TypeError | 當對不適當類型的對象應用操作或函數時引發 |
NameError | 當找不到局部或全局名稱時引發 |
FileNotFoundError | 當請求的文件或目錄不存在時引發 |
IndexError | 當序列下標超出範圍時引發 |
KeyError | 當字典鍵未找到時引發 |
ImportError | 當導入語句失敗時引發 |
就是這樣,各位!你們剛剛完成了你的 Python 錯誤處理速成課程。記住,錯誤不是你的敵人 - 它們更像是有用的指示牌,引導你朝著更好、更強健的代碼前進。繼續練習,繼續實驗,你很快就會像專業人士一樣處理錯誤。快樂編程!
Credits: Image by storyset