Python - 內建異常
你好,有抱負的程序员們!今天,我們將深入探討Python內建異常的迷人世界。如果你是编程新手,不用擔心;我會一步一步引導你通過這個主題,就像我多年教學中為無數學生所做的那樣。讓我們一起踏上這段令人興奮的旅程吧!
Python中的標準內建異常
想象一下,你在廚房裡烹飪,突然發現你缺少了一種關鍵的食材。這與程序中發生異常時的情況類似——某些意料之外的事情打斷了代碼的正常流程。Python有各種各樣的內建異常來處理不同類型的錯誤。
讓我們來看看一些最常見的內建異常:
- SyntaxError:這就像在句子結尾忘記加上句號一樣。當Python遇到不正確的語法時,就會引發此異常。
print "Hello, World!" # SyntaxError: 調用'print'時缺少括號
在這個例子中,我們忘記在print函數中的字符串添加括號,這在Python 3中是必需的。
- NameError:當你試圖使用一個尚未定義的變量時,就會發生此異常。
print(x) # NameError: 名字 'x' 沒有定義
在這裡,我們試圖打印一個我們尚未創建或賦值給它的變量'x'。
- TypeError:當對不恰當的類型執行操作時,就會發生此異常。
"2" + 2 # TypeError: 只能將str(而不是"int")與str連接
在這個例子中,我們試圖將字符串("2")與整數(2)相加,Python不知道如何處理。
- ValueError:當函數收到正確類型但值不恰當的參數時,就會引發此異常。
int("hello") # ValueError: 無效的字面量對int()來說是10進制:'hello'
int()函數期望一個表示數字的字符串,而不是一個單詞。
- 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