Python - 內建異常

你好,有抱負的程序员們!今天,我們將深入探討Python內建異常的迷人世界。如果你是编程新手,不用擔心;我會一步一步引導你通過這個主題,就像我多年教學中為無數學生所做的那樣。讓我們一起踏上這段令人興奮的旅程吧!

Python - Built-in Exceptions

Python中的標準內建異常

想象一下,你在廚房裡烹飪,突然發現你缺少了一種關鍵的食材。這與程序中發生異常時的情況類似——某些意料之外的事情打斷了代碼的正常流程。Python有各種各樣的內建異常來處理不同類型的錯誤。

讓我們來看看一些最常見的內建異常:

  1. SyntaxError:這就像在句子結尾忘記加上句號一樣。當Python遇到不正確的語法時,就會引發此異常。
print "Hello, World!"  # SyntaxError: 調用'print'時缺少括號

在這個例子中,我們忘記在print函數中的字符串添加括號,這在Python 3中是必需的。

  1. NameError:當你試圖使用一個尚未定義的變量時,就會發生此異常。
print(x)  # NameError: 名字 'x' 沒有定義

在這裡,我們試圖打印一個我們尚未創建或賦值給它的變量'x'。

  1. TypeError:當對不恰當的類型執行操作時,就會發生此異常。
"2" + 2  # TypeError: 只能將str(而不是"int")與str連接

在這個例子中,我們試圖將字符串("2")與整數(2)相加,Python不知道如何處理。

  1. ValueError:當函數收到正確類型但值不恰當的參數時,就會引發此異常。
int("hello")  # ValueError: 無效的字面量對int()來說是10進制:'hello'

int()函數期望一個表示數字的字符串,而不是一個單詞。

  1. ZeroDivisionError:當你試圖除以零時,就會發生此異常。
10 / 0  # ZeroDivisionError: 除以零

就像在數學中一樣,程序中的除以零是未定義的。

內建異常的層次結構

Python的內建異常按照層次結構組織,就像家族樹一樣。這棵樹的頂端是BaseException類,所有其他異常都繼承自它。

以下是異常層次結構的簡化版本:

異常層次結構
BaseException
├── SystemExit
├── KeyboardInterrupt
├── GeneratorExit
└── Exception
├── StopIteration
├── ArithmeticError
│ ├── FloatingPointError
│ ├── OverflowError
│ └── ZeroDivisionError
├── AssertionError
├── AttributeError
├── BufferError
├── EOFError
├── ImportError
│ └── ModuleNotFoundError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── MemoryError
├── NameError
│ └── UnboundLocalError
├── OSError
│ ├── FileExistsError
│ ├── FileNotFoundError
│ ├── PermissionError
│ └── TimeoutError
├── ReferenceError
├── RuntimeError
│ └── NotImplementedError
├── SyntaxError
│ └── IndentationError
│ └── TabError
├── SystemError
├── TypeError
├── ValueError
│ └── UnicodeError
└── Warning

理解這個層次結構可以帮助你在代碼中更有效地捕獲和處理異常。

如何使用內建異常

現在我們知道了異常是什麼,讓我們學習如何在代碼中使用它們。處理異常的主要方法是使用try-except塊。這就像學騎自行車時的安全網——如果你摔倒了(遇到異常),網(except塊)就會接住你。

以下是基本的結構:

try:
# 可能會引發異常的代碼
result = 10 / 0
except ZeroDivisionError:
# 處理特定異常的代碼
print("哎呀!你不能除以零。")

在這個例子中,我們試圖除以零,這會引發ZeroDivisionError。except塊捕獲了這個特定的錯誤,並打印了一條友好的消息,而不是讓程序崩潰。

你也可以捕獲多個異常:

try:
# 可能會引發不同異常的代碼
number = int(input("輸入一個數字:"))
result = 10 / number
except ValueError:
print("那不是有效的數字!")
except ZeroDivisionError:
print("你不能除以零!")
except:
print("出了別的問題。")

這個腳本處理不同的情況:如果用戶輸入非數值(ValueError),試圖除以零(ZeroDivisionError),或者發生任何其他意外的錯誤。

明確引發內建異常

有時候,你可能想要自己引發一個異常。這就像比賽中的裁判一樣——當你看到某些不對勁的事情時,你就吹哨子並停止比賽。

以下是如何引發一個異常:

def check_age(age):
if age < 0:
raise ValueError("年齡不能為負!")
elif age < 18:
print("你是未成年人。")
else:
print("你是成年人。")

try:
check_age(-5)
except ValueError as e:
print(e)

在這個例子中,我們創建了一個檢查人年齡的函數。如果有人試圖輸入負數年齡,我們會引發一個ValueError並帶有自定義的消息。函數外的try-except塊捕獲了這個異常,並打印了錯誤消息。

記住,引發異常應該謹慎使用。這是一個強大的工具,但過度使用它可能會使你的代碼難以理解和維護。

總結來說,理解和有效地使用Python的內建異常對於编写健壯且抗錯誤的代碼至關重要。這就像學習航海一樣——知道潛在的風暴(異常)以及如何處理它們,將使你的編程之旅更加順利和愉快。

繼續練習,保持好奇,不要害怕遇到異常——它們是學習和改進代碼的機會!

Credits: Image by storyset