10种常见的Python错误类型及其解决方法
作为一个程序员,在开发软件过程中,你肯定会遇到错误。这可能是由于逻辑错误导致意外结果,违反编程语言规则引起的错误,甚至是程序运行时出现的错误,还有许多其他错误。这些错误通常被称为bug。
无论编程语言有多容易学习和使用,bug在每一种编程语言中都是普遍存在的。
例如,在python中,尽管该语言强调可读性,遵循表达性的语法,并且相对于其他编程语言来说相对容易学习和使用,但在使用python时,你仍然不会免于编程错误。
由于错误是不可避免的,解决错误的好方法是了解可能发生的不同类型的错误以及它们是如何发生的。这样你就可以在编程时避免或最小化这些错误,并且在错误发生时知道如何处理它们。
下面是在使用python编程时可能遇到的一些常见错误:
syntaxerrors
语法错误是在你编写违反所使用编程语言规则的代码时发生的错误。这导致了一行无效的代码。
例如,在python中,当打印一个字符串时,它需要放在引号之间。如果没有这样做,就会导致语法错误。
语法错误还可能在你缺少打开或关闭括号、方括号、花括号,拼写关键字或函数名出错,流程控制语句末尾缺少冒号,或者在表达式中缺少所需的运算符时发生。
一般来说,如果你违反了python代码编写的规则,就会发生语法错误。
## 由于缺少引号导致的语法错误
## 打印字符串时缺少引号
print("hello world)
age = 20
## if语句中缺少冒号导致的语法错误
if age > 18
print("age is over 18")
## '('未关闭导致的语法错误
def square(x:
return x * x
print(square(4))
运行以上代码后,你将遇到以下错误消息:
运行代码后的错误消息如下:
file "/home/madici/desktop/helloworld.py", line 1
print("hello world)
^
syntaxerror: unterminated string literal (detected at line 1)
为了解决这些错误,使用正确的python语法如下所示:
print("hello world")
age = 20
if age > 18:
print("age is over 18")
def square(x):
return x * x
print(square(4))
indentationerror
与java、c或c++等其他语言使用花括号来分隔代码块不同,python使用缩进来定义代码块的层次和结构。例如,在java中编写控制语句时,所有在条件评估完成后要执行的代码都包含在花括号内。
然而,在python中,代码块将缩进。python中的典型缩进为四个空格或一个制表符。然而,空格的数量并不重要,只要在编写的代码中保持一致即可。
作为一名python程序员,当您未添加所需的缩进时,例如在编写控制语句或函数时,当您同时使用制表符和空格创建缩进时会使解释器混淆,当您将缩进放置在错误的位置或者当您的缩进在整个代码库中不一致时,您可能会遇到缩进错误。
下面是导致缩进错误的代码示例:
age = 20
if age > 18:
print("age is greater than 18")
print("you're allowed to drive")
else:
print("age is less than 18")
上述代码导致的错误消息如下所示:
运行该代码时的错误消息如下所示:
file "/home/madici/desktop/helloworld.py", line 3
print("age is greater than 18")
^
indentationerror: 在第2行'if'语句后预期一个缩进块
为了更正错误,将if语句后的行缩进,并确保它与代码的其余部分的缩进匹配,如下所示:
age = 20
if age > 18:
print("age is greater than 18")
print("you're allowed to drive")
else:
print("age is less than 18")
typeerror
在python中,typeerror是一种异常,当您尝试使用不兼容的数据类型执行操作时会引发该异常。例如,如果您尝试将一个字符串和一个整数相加或将字符串数据类型与整数连接起来,您将遇到typeerror。
当您使用具有不正确数据类型的函数或方法,尝试使用非整数索引来访问可迭代对象(如列表)中的项,或者尝试迭代不可迭代的对象时,也可能遇到typeerror。
通常,任何使用不正确数据类型的操作都将导致typeerror。
下面是导致typeerror的操作示例:
# 由于字符串与整数相连而导致的typeerror
age = 25
message = "i am " + age + " years old."
list1 = [1, "hello", 5, "world", 18, 2021]
# 由于错误使用内置方法而导致的typeerror
print(sum(list1))
# 由于字符串和整数相加而导致的typeerror
num1 = 10
num2 = "16"
print(num1 + num2)
# 由于使用非整数索引而导致的typeerror
list2 = ["hello", "from", "the", "other", "side"]
print(list2["1"])
上述代码导致的错误消息如下所示:
代码中的一个示例typeerror消息如下所示:
file "/home/madici/desktop/helloworld.py", line 3, in <module>
message = "i am " + age + " years old."
~~~~~~~~^~~~~
typeerror: 仅能将str与str(而不是"int")连接成str
为了消除错误,请使用正确的数据类型或类型转换,如下所示:
age = 25
message = "i am " + str(age) + " years old."
list1 = [1, 5, 18, 2021]
print(sum(list1))
num1 = 10
num2 = "16"
print(num1 + int(num2))
list2 = ["hello", "from", "the", "other", "side"]
print(list2[1])
attributeerror
在python中,当您尝试使用对象上不存在的属性或调用对象上不存在的方法时,会发生attributeerror。attributeerror显示对象没有被调用的属性或方法。
例如,如果您在整数上调用字符串方法,您会遇到attributeerror,因为该方法不存在于您调用它的对象的类型上。
在下面的示例中,将capitalize()方法用于将字符串的第一个字母转换为大写字母,然后将其应用于整数。结果是一个属性错误,因为int类型没有capitalize()方法。
运行此代码会导致显示以下错误消息:
代码中的attributeerror消息如下所示:
file “/home/madici/desktop/helloworld.py”, line 3, in
cap = num.capitalize()
^^^^^^^^^^^^^^
attributeerror: ‘int' object has no attribute ‘capitalize'
要解决attributeerror,请确保您调用的方法或属性存在于调用它的对象的类型上。在这种情况下,将capitalize()应用于字符串数据类型可以解决此错误,如下所示:
importerror
当尝试导入在当前环境中找不到或无法访问的模块时,python会出现importerror。可能是模块尚未安装,您尚未正确配置其路径,或者您拼写错误。importerror有一个名为modulenotfounderror的子类,当尝试导入找不到的模块时会抛出此错误。
例如,下面的代码尝试导入数据分析库pandas,但由于该模块尚未安装,因此会引发此类错误。
生成的importerror消息如下所示:
file “/home/madici/desktop/helloworld.py”, line 1, in
import pandas
modulenotfounderror: no module named ‘pandas'
要解决此类错误,请确保您尝试导入的模块已安装。如果这样做不解决错误,请检查您是否使用了模块的正确拼写和正确的文件路径以访问模块。
valueerror
这是在python中的函数接收到正确数据类型的值,但该值是不合适的值时发生的异常。例如,用于查找数值的平方根的math.sqrt()函数,如果传入负数,将返回valueerror。
尽管该值将是正确类型的数值,但其为负数使其成为不合适的值。
函数int()用于转换数字或字符串,如果传入的字符串不是数值字符串,则会返回valueerror。将“123”或“45”传递给函数不会返回错误,因为字符串可以转换为适当的整数值。
然而,如果您传入的是一个不是数字字符串值的字符串,例如“hello”,它会返回一个valueerror。这是因为“hello”虽然是一个字符串,但是它不适合作为整数的等价物。
下面是一个生成valueerror的代码示例:
# 由于sqrt()中不适当的int值而导致的值错误
import math
num = -64
root = math.sqrt(num)
print(root)
# 由于将没有整数等价物的字符串传递给int()函数而导致的值错误
numstring = "hello"
num = int(numstring)
print(num)
上面代码的错误如下所示:
生成的错误消息如下所示:
file "/home/madici/desktop/helloworld.py", line 4, in
root = math.sqrt(num)
^^^^^^^^^^^^^^
valueerror: math domain error
要纠正此错误,请在函数中使用适当的值,如下所示:
import math
num = 64
root = math.sqrt(num)
print(root)
numstring = "5231"
num = int(numstring)
print(num)
ioerror
ioerror(输入/输出错误)是在输入或输出操作失败时发生的异常。这可能是由于尝试访问不存在的文件,在设备中的磁盘存储不足,尝试访问您没有足够权限访问的文件,或者尝试访问正在被其他操作使用的文件时导致的。
在处理文件时通常使用的open()、read()、write()和close()等方法是可能引起此类错误的方法。
考虑下面的代码,它尝试打开一个名为“notes.txt”的不存在的文件。该代码导致ioerror,引发了filenotfounderror:
以下是错误消息:
file "/home/madici/desktop/helloworld.py", line 2, in
file1 = open("notes.txt", "r")
^^^^^^^^^^^^^^^^^^^^^^
filenotfounderror: [errno 2] no such file or directory: 'notes.txt'
为了避免上述错误,您只需要确保“notes.txt”文件存在于您运行终端的目录中。处理ioerrors的另一种方法是使用try except块,如下所示:
nameerror
nameerror是一种异常,当您尝试使用不存在的变量、函数或模块,或者在当前作用域中未定义它们或未分配值时,将遇到此异常。
这种错误通常发生在拼写变量或函数名称错误或在定义之前使用它们时。在没有导入模块的情况下使用模块也会导致nameerror。
以下代码将导致nameerror异常:
# 由于未导入math模块而导致的名称错误
num = 64
root = math.sqrt(64)
print(root)
# 由于在定义之前使用了x而导致的nameerror
y = 23
print(x)
# 函数名未定义导致的nameeror
def greet():
print("good morning")
great() #ameerror: name 'great' is not defined
上面的代码产生的错误消息如下所示:
以下是一个示例的nameerror消息:
file "/home/madici/desktop/helloworld.py", line 3, in
root = math.sqrt(64)
^^^^
nameerror: name 'math' is not defined
要解决这样的nameerror,请确保在导入模块之前不要使用它们,不要在定义之前使用变量或函数,也不要拼写错误的函数或变量名:
import math
num = 64
root = math.sqrt(64)
print(root)
y = 23
print(y)
def greet():
print("早上好")
greet()
indexerror
indexerror是在尝试访问超出列表或元组范围的索引时发生的异常。考虑以下列表:
list1 = [1, 2, 3, 4, 5]
该列表有五个元素。python从0开始计数索引。因此,上面的列表的索引范围从0到n-1,其中n是列表中的元素数量。在这种情况下,列表的索引范围将从0到4。
如果尝试访问大于4的索引处的元素,则会遇到indexerror,因为该索引超出了要从中访问元素的列表的范围。下面的代码会生成indexerror:
list1 = [1, 2, 3, 4, 5]
item = list1[6] #因为列表索引超出范围,所以会出现indexerror
print(item)
代码中的错误如下所示:
生成的indexerror消息如下所示:
file "/home/madici/desktop/helloworld.py", line 2, in
item = list1[6] #因为列表索引超出范围,所以会出现indexerror
~~~~~^^^
indexerror: list index out of range
避免indexerror的最佳方法是使用range()和len()函数,以确保仅访问范围内的元素,如下所示:
list1 = [1, 2, 3, 4, 5]
for i in range(len(list1)):
print(list1[i])
keyerror
keyerror是在尝试使用键从字典中访问项时,如果在字典中找不到该键,则会发生的异常。考虑以下字典:
cities = {"canada": "ottawa", "usa": "washington", "italy": "rome"}
字典中的键是“canada”,“usa”,“italy”。您可以使用这三个键从cities字典中访问项。但是,如果尝试使用不存在的键来访问元素,例如“brazil”,则会遇到keyerror,如下所示:
生成的keyerror消息如下所示:
file "/home/madici/desktop/helloworld.py", line 6, in
print(cities["brazil"])
~~~~~~^^^^^^^^^^
keyerror: 'brazil'
要解决keyerror,请确保您在字典中使用的键实际上存在于字典中。为此,您可以使用if…else语句,如下所示:
cities = {"canada": "ottawa", "usa": "washington", "italy": "rome"}
country = "canada"
if country in cities:
print("该国的首都是" + country + "是" + cities[country])
else:
print("键" + country + "不存在于cities字典中")
这样,当访问字典中的元素时,您将避免遇到keyerrors。
结论
在使用python进行编码时,无论您的专业水平如何,都可能会遇到错误。因此,请确保熟悉本文中介绍的不同类型的错误,以确保在出现错误时能够处理它们。
您还可以探索一些有用的python一行代码来简化常见任务。