這篇文章是閱讀Asabeneh的30 Days Of Python: Day 15 - Python Type Errors後的學習筆記與心得。
跟JavaScript(以下簡稱JS)一樣,像是打錯字(typo)或是一些常見的錯誤,Python的直譯器(interpreter)跑到該段落時就會顯示錯誤訊息;了解錯誤訊息的型別能幫助辨識出錯的原因,讓除錯更順利。
出現在語法錯誤的時候,下方的print
函式忘了加括號:
print "hello world"
# SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
print(...)
出現在使用了未定義的變數名稱的時候:
happy("python")
# NameError: name 'happy' is not defined
修復的方式就是定義happy
這個名稱:
def happy(string):
print(string.upper())
當嘗試索引的值超過串列(list)實際有的項目個數時產生:
numbers = [1, 2, 3, 4, 5]
# list index starts from 0
numbers[5]
# IndexError: list index out of range
當嘗試引入不存在的模組時產生:
import maths
# ModuleNotFoundError: No module named 'maths'
math
,不是複數型當嘗試訪問物件中不存在的屬性時產生,這邊實際上math
模組中有的是pi
(大小寫有差):
import math
math.PI
# AttributeError: module 'math' has no attribute 'PI'. Did you mean: 'pi'?
math.pi
當嘗試訪問字典(dictionary)中不存在的鍵(key)時會產生:
greek_alphabet = {"A": "alpha", "B": "beta", "K": "kappa"}
greek_alphabet["C"]
# KeyError: 'C'
型別錯誤,發生在使用錯誤的型別進行操作時:
print(123 + "456")
# TypeError: unsupported operand type(s) for +: 'int' and 'str'
int
型別另一個是str
型別,不能相加。"123" + "456"
,印出字串 - 123456
修正的方法可以是把其中一方轉換成另一方的型別:
print(str(123) + "456") # '123456'
print(123 + int(456)) # 579
發生在嘗試從模組中引入不存在的物件時:
from math import power
# ImportError: cannot import name 'power' from 'math' (unknown location)
pow
當操作或給函式參數的值是正確型別,但內容有問題,且此情況不能用更精確的錯誤類型描述,如IndexError
:
print(int("12a"))
# ValueError: invalid literal for int() with base 10: '12a'
int()
的參數值不對,若多給一個參數改成16進位就會成功:int("12a", base=16)
,輸出298用任意數除以0就會產生這個錯誤:
print(1/0)
# ZeroDivisionError: division by zero