1、Python中的错误
对于刚入门Python的初学者来说,在运行的过程中难免会出现各种各样的错误,比如语法错误、命名错误、类型错误、索引错误等,不同的错误类型解决方法是不同的,本节将介绍Python中常见的运行错误及解决方法。
(1)语法错误
初学者在编写Python程序时,语法错误是最常见的错误之一。这种错误通常是因为代码中缺少某个符号,如括号、引号、冒号等或者错写成中文标点符号导致的。例如:
def say() # 函数名()后面缺少冒号,会报语法错误
print("Python在线教程:pyhint.com")
print "Python在线教程:pyhint.com" # print语句必须使用括号
如果错误信息是以“SyntaxError”开头,就说明python解释认为这是一个语法错误,并且通常会在错误信息中指明错误发生的行号以及错误原因,所以我们可以通过查看错误信息来定位问题所在。
(2)命令错误
命令错误通常是由于使用了未定义的变量或函数名造成的。例如:
print(a)
上面的例子中,如果a没有被定义,那么将会发生命名错误。解决方法是检查代码中的变量和函数名是否正确定义。
(3)类型错误
类型错误通常是由于使用了不正确的数据类型或者函数返回了不正确的数据类型造成的。例如:
a = "2"
b = 3
c = a+b
print(c)
上面的例子中,a是字符串类型,b是整数类型,不能直接相加,因此会发生类型错误。解决方法是检查代码中的数据类型是否正确,并进行相应的类型转换。
(4)索引错误
索引错误通常是由于尝试使用不存在的索引或切片导致的。例如:
b = [4, 5, 6]
print(b[4])
上面的例子中,b只有三个元素,但是我们尝试用b[4]访问第五个元素,因此会发生索引错误。解决方法是检查代码中的索引或切片是否正确。
2、Python中的异常
熟悉Python语法后,可以避免语法错误,有时候程序在语法上都是正确的,但是代码在运行的时候也可能会发生异常(Exception)触发错误。运行时检测到的错误称为异常,异常不一定导致严重的后果,但如果程序对大多数的异常都不做处理,Python解释器会输出异常信息到屏幕上并终止程序。例如:
动手练一练:
print(10 / 0) # 除数不能为零,否则会触发ZeroDivisionError异常
# 上面出现异常,已终止程序,不会执行print()函数
print("Python在线教程:pyhint.com")
执行以上代码,输出结果为:
print(10 / 0) # 除数不能为零,否则会触发ZeroDivisionError异常
ZeroDivisionError: division by zero
从运行结果可以看到,前三行是以调用的形式显示具体信息,包含异常发生的位置行号;最后一行显示异常类型。上面输出的结果中有个除零错误“ZeroDivisionError”,还有以“Traceback”开头的错误,像这种错误我们称之为异常。异常有不同的类型,发生异常后,其类型名称会被打印出来。Python中还有很多各种各样的异常类型,可自行查阅官方文档了解。
3、处理异常
如果担心代码会出现异常,我们可以让它自动处理异常。在Python中,异常处理机制允许我们在程序中捕获和处理异常,以便在遇到问题时执行特定的操作而不中断程序的正常执行流程。Python的异常处理主要通过try/except语句实现。例如:
动手练一练:
try:
a = 10 / 0
except ZeroDivisionError:
print("捕获一个ZeroDivisionError异常")
except TypeError:
print("捕获一个TypeError异常")
执行以上代码,输出结果为:
捕获一个ZeroDivisionError异常
上面的例子中,这段代码会捕获ZeroDivisionError异常,并打印“捕获一个ZeroDivisionError异常”。使用try和except语句块来捕获并处理异常,一个try语句可以有多个except子句,用于处理不同类型的异常。在try块中放置可能引发异常的代码,如果异常发生,则会跳过剩余的try块代码,并将控制流转到except匹配异常类型。如果匹配得上,则运行处理异常的语法块,否则程序就报错退出。
4、抛出异常
除了捕获异常,我们也可以用raise语句主动抛出异常。例如:
raise Exception
上面的例子中,结果输出了一个没有任何内容的异常,错误信息是空的。我们也可以自定义指定输出一个有错误内容的异常。
raise Exception("这是错误异常信息")
执行以上代码,输出结果为:
Exception: 这是错误异常信息
5、finally和else子句
Python中,除了try和except之外,Python的异常处理还有两个其他的关键字:finally和else。finally子句需要和try子句一起使用。finally语句允许在try块中的代码无论是否发生异常都会被执行。例如:
动手练一练:
try:
a = 10 / 0
except ZeroDivisionError:
print("除零错误") # 输出 除零错误
finally:
print("仍然执行") # 输出 仍然执行
执行以上代码,输出结果为:
除零错误
仍然执行
上面的例子中,程序成功捕获了“ZeroDivisionError”异常后,finally子句中的代码仍然被执行。
else语句块中的代码会在try块没有抛出任何异常的情况下运行。
动手练一练:
try:
a = 10 / 2
except ZeroDivisionError: # 没有捕获ZeroDivisionError异常
print("除零错误")
else:
print("没有捕获任何异常") # 输出 没有捕获任何异常
执行以上代码,输出结果为:
没有捕获任何异常
上面的例子中,程序在try块中没有捕获任何异常,成功执行else子句中的代码。在程序开发中,用这个方法区分“正常”运行和异常处理时很有用。