一.异常情况
IndentationError | 缩进错误 |
NameError | 未声明,未初始化对象错误 |
ImportError | 导入模块/对象错误 |
ZeroDivisionError | 除数为0引发的错误 |
SyntaxError | 语法错误 |
TypeError | 类型不合适引发的错误 |
ValueError | 传入无效参数 |
IndexError | 索引超出序列范围 |
AttributeError | 访问未知对象属性引发的错误 |
举个栗子:(下文代码有误)
#缩进错误
x = int(input(''))
if x>6:
print('Right')#正常在此应该有缩进
else:
print('Wrong')
运行结果:
我们知道在python中有严格对代码的要求,所以当缩进错误时,代码可能无法执行或者进行错误的执行(与我们所想达到的执行情况不一样)。 当我们缩进正常时,可正常执行。
再举个栗子:(以下代码有误):
#语法错误
x = int(input(''))
while x<6 #此处有错误
x+=1
print(x)
运行结果:
当我们在x<6后面加一个:后,代码可以正常运行。
当我们刚开始写代码时,不可避免会犯一些错误,我们需要认识一些常见的代码错误。
当我们写一个程序时,如果要投入使用,肯定要保证代码在用户使用过程中不会出错,也就是当代码出现异常时程序能够处理。
二.try...except 语句
语法格式:
try:
语句块1(可能出现异常的语句)
except 异常类型:
语句块2(处理异常的语句)
#try...except 语句
try:
num1 = float(input("请输入被除数:"))
num2 = float(input("请输入除数:"))
result = num1 / num2
print(f'计算的结果是{result:.2f}')
except ZeroDivisionError:
print("除数不能为0")
运行结果:
如上,假如我们做一个计算的程序,如果用户输入了0作除数,我们的代码便报错然后无法执行后面的程序,则会影响用户后续的体验。我们通过对比上面两张图片的结果,可以得到当我们使用 try...except 语句时,报错可以得到有效处理使得后面程序可以正常运行。
try语句的执行过程:
首先执行try语句下的内容,如果没有异常发生,则忽略except语句,执行后面的语句(即执行完try语句后结束)。如果出现了和except中的异常名称一样的异常,那么对应的except语句将会执行。如果出现了的异常不是except语句中的异常,那么try语句后面的内容将不执行。
try:
result = int(input('请输入一个数:'))
print(result+1)
except ValueError:
print("传入无效参数")
except TypeError:
print("类型不合适引发的错误")
except:
print("是一个未知的错误被触发了")
运行结果:
在这个例子中,我们可以看到,当我们输入的是1时,try不会报任何错误,因此程序执行完try中的子句后不会再执行except语句。当我们输入hh时,hh并不能被int()变成数字,所以触发了except中的ValueError语句。由于没有找到合适的代码,当我们把result = int(input('请输入一个数:'))这个代码中的int()去掉时,即使输入数字2,也依旧会报错,这时爆出的错是TypeError,此时输入的2是字符串类型,但print(result+1)语句中1是整数类型。
一个try语句中可能包含多个except语句,分别用来处理不同的异常,但最多只有一个异常分支会被执行。
三.try...except...else语句
语法格式:
try:
语句块1
except (异常类型):
语句块2
else:
语句块3
如果语句块1不能正常运行,则执行语句块2;如果语句块1能正常运行,则执行语句块3.
else语句将在try语句没有任何异常时执行,如果使用else语句,必须放在所有except语句块之后。
try:
num1 = float(input("请输入被除数:"))
num2 = float(input("请输入除数:"))
result = num1 / num2
print(f'计算的结果是{result:.2f}')
except ZeroDivisionError:
print("除数不能为0")
else:
print('程序没有任何异常')
运行结果:
在这两张运行结果的图片中,我们可以看到,我们先使用num1,num2输入两个浮点数,然后把num1 / num2的结果赋值给result并限制小数点为两位进行打印。当除数为0时,执行了except语句且未执行else语句。当除数不为0时,没有执行except语句,执行了else语句。
四.try...except...finally...语句
语法格式:
try:
语句块1
except (异常类型):
语句块2
finally:
语句块3
无论try下的语句是否异常,finally下的语句块3都会执行。
try:
num1 = float(input("请输入被除数:"))
num2 = float(input("请输入除数:"))
result = num1 / num2
print(f'计算的结果是{result:.2f}')
except ZeroDivisionError:
print("除数不能为0")
else:
print('程序没有任何异常')
finally:
print("程序执行完毕")
运行结果:
如上图运行结果,我们可以看出finally语句是一定会被执行的。