深入理解 Python 中的錯誤種類
更新日期: 2024 年 10 月 10 日
在學習和編寫 Python 程式的過程中,你可能會遇到各種各樣的錯誤訊息。
這些錯誤訊息通常稱為例外(Exception),它們提供了有關程式何時以及為何崩潰的重要線索。
對於新手來說,理解這些錯誤的種類和含義是學習 Python 的重要一步。
本文將為你詳細介紹 Python 中常見的錯誤種類,幫助你更有效地調試和修復程式。
Python 中的錯誤類型
Python 中的錯誤主要分為兩大類:
- 語法錯誤(Syntax Errors):程式碼不符合 Python 語法規則。
- 例外(Exceptions):程式在執行過程中遇到了無法處理的情況。
語法錯誤(Syntax Errors)
SyntaxError
說明:當 Python 解釋器無法解析你的程式碼時,就會拋出 SyntaxError
。
示例:
print("Hello, World! # 缺少關閉引號
錯誤訊息:
SyntaxError: EOL while scanning string literal
解決方法:檢查程式碼語法,確保使用了正確的語法和標點符號。
IndentationError
說明:Python 使用縮排來表示代碼塊。如果縮排不正確,會引發 IndentationError
。
示例:
def greet():
print("Hello")
錯誤訊息:
IndentationError: expected an indented block
解決方法:檢查縮排,確保代碼塊內的代碼正確縮排。
常見的例外(Exceptions)
NameError
說明:當程式嘗試訪問一個未定義的變數時,會拋出 NameError
。
示例:
print(age)
錯誤訊息:
NameError: name 'age' is not defined
解決方法:確保變數在使用前已經正確定義或宣告。
TypeError
說明:當對不支援的類型執行操作時,會引發 TypeError
。
示例:
result = "Hello" + 5
錯誤訊息:
TypeError: can only concatenate str (not "int") to str
解決方法:檢查數據類型,確保操作符和函式適用於該類型。
ValueError
說明:當函式接收到正確類型但不適合的值時,會拋出 ValueError
。
示例:
number = int("abc")
錯誤訊息:
ValueError: invalid literal for int() with base 10: 'abc'
解決方法:檢查函式的輸入值,確保值適合該函式。
IndexError
說明:當試圖訪問列表、元組或字串中不存在的索引時,會引發 IndexError
。
示例:
my_list = [1, 2, 3]
print(my_list[5])
錯誤訊息:
IndexError: list index out of range
解決方法:檢查索引值,確保不超出序列的範圍。
KeyError
說明:當使用不存在的鍵訪問字典時,會拋出 KeyError
。
示例:
my_dict = {"name": "Alice"}
print(my_dict["age"])
錯誤訊息:
KeyError: 'age'
解決方法:檢查字典中是否存在該鍵,或者使用 dict.get()
方法提供默認值。
AttributeError
說明:當試圖訪問物件不存在的屬性或方法時,會引發 AttributeError
。
示例:
my_list = [1, 2, 3]
my_list.push(4)
錯誤訊息:
AttributeError: 'list' object has no attribute 'push'
解決方法:檢查物件的屬性和方法是否正確,確保使用了正確的 API。
ImportError / ModuleNotFoundError
說明:當無法導入模組或包時,會拋出 ImportError
或 ModuleNotFoundError
。
示例:
import non_existing_module
錯誤訊息:
ModuleNotFoundError: No module named 'non_existing_module'
解決方法:檢查模組名稱是否正確,確保模組已安裝。
ZeroDivisionError
說明:當除數為零時,會引發 ZeroDivisionError
。
示例:
result = 10 / 0
錯誤訊息:
ZeroDivisionError: division by zero
解決方法:在執行除法運算前,檢查除數是否為零。
FileNotFoundError
說明:當嘗試打開不存在的文件時,會拋出 FileNotFoundError
。
示例:
with open("non_existing_file.txt", "r") as file:
content = file.read()
錯誤訊息:
FileNotFoundError: [Errno 2] No such file or directory: 'non_existing_file.txt'
解決方法:檢查文件路徑和名稱是否正確,確保文件存在。
IOError / OSError
說明:當進行輸入/輸出操作失敗時,會引發 IOError
或 OSError
。
示例:
with open("/protected/file.txt", "w") as file:
file.write("Hello")
錯誤訊息:
PermissionError: [Errno 13] Permission denied: '/protected/file.txt'
解決方法:檢查文件權限和路徑,確保有足夠的權限進行操作。
處理例外
為了使程式更加健壯,我們可以使用 try-except
語句來捕獲和處理例外。
基本語法
try:
# 可能引發例外的代碼
pass
except ExceptionType:
# 處理例外的代碼
pass
示例
try:
number = int(input("請輸入一個整數:"))
result = 10 / number
print(f"結果是:{result}")
except ValueError:
print("輸入的不是有效的整數!")
except ZeroDivisionError:
print("不能除以零!")
使用 else
和 finally
else
子句
else
子句會在沒有發生例外時執行。
try:
# 可能引發例外的代碼
pass
except ExceptionType:
# 處理例外的代碼
pass
else:
# 沒有發生例外時執行的代碼
pass
finally
子句
finally
子句無論是否發生例外,都會執行。
try:
# 可能引發例外的代碼
pass
except ExceptionType:
# 處理例外的代碼
pass
finally:
# 無論是否發生例外都執行的代碼
pass
自定義例外
你還可以自定義例外類型,繼承自內建的 Exception
類。
示例
class NegativeNumberError(Exception):
"""自定義例外類型,用於處理負數錯誤"""
pass
def sqrt(number):
if number < 0:
raise NegativeNumberError("不能計算負數的平方根")
return number ** 0.5
try:
result = sqrt(-9)
except NegativeNumberError as e:
print(e)
輸出:
不能計算負數的平方根
結論
理解 Python 中的錯誤種類對於編寫健壯且可靠的程式至關重要。
通過熟悉常見的錯誤和例外,你可以更快地定位問題並修復它們。
同時,使用 try-except
語句可以使你的程式更加健壯,能夠優雅地處理運行時的異常情況。
進一步學習
- 閱讀官方文檔:深入了解 Python 的例外和錯誤。
- 練習調試技巧:使用調試工具和日誌來追蹤和修復錯誤。
- 撰寫單元測試:通過測試來預防和發現程式中的錯誤。