2.1 產生例外
打不過就加入。如果我們無法避免程式中的錯誤,我們必須學會控制它們。因此,讓我們學會故意產生例外。
最簡單的例外範例— 就是除以零。程式也是簡單的:
x = 100 / 0
這樣的程式碼會出現錯誤:
Traceback (most recent call last):
File "", line 1, in
x = 100 / 0
~~~^~
ZeroDivisionError: division by zero
ZeroDivisionError
— 這是例外的名稱,而 division by
zero
— 是它的簡短描述。此外,Python 會告訴你這個例外發生在哪一行。
資料類型不匹配
當然,也有可能發生其他例外。例如,當你試圖將字符串和數字相加時:
s = "100" + 100
會出現例外 TypeError
:
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'str' and 'int'
超出列表範圍
另一個非常常見的錯誤會產生例外——就是試圖訪問列表中不存在的元素:
my_list = [1, 2, 3]
print(my_list[10])
會出現例外 IndexError
:
Traceback (most recent call last):
print(my_list[10])
~~~~~~~^^^^
IndexError: list index out of range
總共有多少種呢?有幾千種不同類型的例外。更何況,如果現有的例外不足以描述某種特定情況,你可以創建自己的例外。雖然最熱門的並不多。
2.2 最熱門例外清單
雖然例外很多,但對你這樣的初學者來說,了解最熱門的會很有幫助。以下我會給你一個表格:
例外 | 描述 |
---|---|
Exception |
所有例外的基礎類別。 |
IndexError |
當你試圖訪問序列(例如列表或元組)中不存在的索引時發生。 |
KeyError |
當你試圖訪問字典中不存在的鍵時發生。 |
NameError |
當你試圖訪問不存在的變數時發生。 |
RuntimeError |
當其他類型的例外無法描述的執行時錯誤時發生。 |
StopIteration |
用於指示迭代結束。 |
SyntaxError |
當程式碼中有語法錯誤時發生。 |
IndentationError |
程式碼縮排錯誤時發生(SyntaxError 的一種子類型)。 |
TabError |
當縮排中混合使用 Tab 和空格時發生(IndentationError 的一種子類型)。
|
TypeError |
當嘗試對不相容的資料類型執行操作時發生。 |
UnboundLocalError |
在宣告本地變數之前嘗試使用時發生(NameError 的一種子類型)。
|
ValueError |
當函數或操作接收到值不正確的參數時發生。 |
ZeroDivisionError |
當除以零時發生。 |
你這個新手,可能在學習的第一個月就會遇到這些錯誤。這沒什麼不對的——因為只有在錯誤中學習。
2.3 程式碼中的錯誤
讓我們再探討一些程式碼中會發生錯誤的情況,讓你更容易在自己的程式碼中找到它們:
IndentationError
這種錯誤發生在程式碼中的縮排做得不正確時。例如,混合使用 Tab 和空格或者不正確的縮排量。
def example():
print("Hello")
print("World") # 錯誤的縮排將引發 IndentationError
example()
NameError
def example():
print(undeclared_variable) # 嘗試使用未宣告的變數將引發 NameError
example()
ValueError
當函數或操作接收到正確類型但不適當值的參數時,會發生這種錯誤。
def example():
int("abc") # 嘗試將非數字字符串轉換成整數將引發 ValueError
example()
KeyError
當程式試圖訪問字典中不存在的鍵時,會發生這種錯誤。
def example():
my_dict = {"a": 1, "b": 2}
print(my_dict["c"]) # 嘗試訪問不存在的鍵將引發 KeyError
example()
SyntaxError
當程式碼中有語法錯誤時,就會發生這種錯誤,也就是說程式碼不符合 Python 語法規則。
def example():
eval("if True print('Hello')") # 錯誤的語法將引發 SyntaxError
example()
知道錯誤在哪裡,就等於有了應對武器。現在你可以識別並創建引發錯誤的情況。是時候學會處理這些錯誤了。
GO TO FULL VERSION