前言
我们在写代码时不可避免地会出错,这时候编译器便会抛出异常并中断程序的执行。针对这种情况,我们可以采用异常处理的方式捕捉程序中的异常信息,并将异常信息打印出来供程序员分析,同时呢还要避免因为程序抛出异常而中断其继续向下执行。异常检测代码结构如下:
try:
要检测异常信息的代码段
except 异常信息 as e:
要打印的报错信息供程序员分析
else:
如果要检测的代码段没有发生异常,那就执行这部分代码
finally:
无论程序是否有异常,这里的代码均可以执行
实践
我们以分母为0为例学习异常处理的相关内容,众所周知在除法中分母是不能为0的,若分母为0,程序便会抛出异常信息:
numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
print(result)
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 0
>>> ZeroDivisionError: division by zero
可见程序抛出了异常信息ZeroDivisionError
并且中断执行。此时我们便可以通过try-except
结构来捕捉异常信息:
try:
numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
except ZeroDivisionError as e:
print("You can't divide by zero! idiot!")
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 0
>>> You can't divide by zero! idiot!
可见此时程序并没有中断,当其发现程序中有ZeroDivisionError
时,便执行print("You can't divide by zero! idiot!")
这行代码用于提示程序员发生了除零错误。
那么如果我们不小心把除数写成了字符串会发生什么呢?
numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
print(result)
>>> Enter a number to divide: 5
>>> Enter a number to divide by: david
>>> ValueError: invalid literal for int() with base 10: 'david'
可见代码抛出了ValueError
,提示程序员这里应该是int型数据而不是字符串,那么我们同样可以使用异常处理方式捕捉这个异常信息:
try:
numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
except ZeroDivisionError as e:
print("You can't divide by zero! idiot!")
except ValueError as e:
print("Enter only numbers plz")
>>> Enter a number to divide: 5
>>> Enter a number to divide by: david
>>> Enter only numbers plz
不难发现程序捕捉到了这个异常信息,并打印出Enter only numbers plz,用于提醒用户只能输入数字,不能输入字符串。其实Python中包含了许许多多的异常信息用于帮助程序员分析代码,如果我们想让代码检测所有的异常信息,那么就用到了下述代码:
try:
numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
except ZeroDivisionError as e:
# 用于打印程序自带的异常信息
print(e)
print("You can't divide by zero! idiot!")
except ValueError as e:
print(e)
print("Enter only numbers plz")
except Exception as e:
print(e)
print("something went wrong :(")
也就是不指定特定的异常信息,用Exception
来代替,这样做的好处就是程序即便发现了异常也不会中断会继续执行下去。这里需要注意的是,在判断异常时,一定是先判断是否是某一类异常,最后再判断是否是一个异常信息。那么如果程序没有异常时,我们希望它能执行的代码放在else
语句下边:
try:
numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
except ZeroDivisionError as e:
print(e)
print("You can't divide by zero! idiot!")
except ValueError as e:
print(e)
print("Enter only numbers plz")
except Exception as e:
print(e)
print("something went wrong :(")
else:
print(result)
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 1
>>> 5.0
可见,当我们的输入都合法时,程序就会得到两个数相除的计算结果并打印到控制台。其实我们还可以书写一些代码,这些代码无论程序是否发生异常,他们都会被执行,这些代码需要放在finally
的下面:
try:
numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
except ZeroDivisionError as e:
print(e)
print("You can't divide by zero! idiot!")
except ValueError as e:
print(e)
print("Enter only numbers plz")
except Exception as e:
print(e)
print("something went wrong :(")
else:
print(result)
finally:
print("This will always execute")
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 1
>>> 5.0
>>> This will always execute
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 0
>>> division by zero
>>> You can't divide by zero! idiot!
>>> This will always execute
以上便是异常的全部内容,感谢大家的收藏、点赞、评论。我们下一节将介绍文件检测(File Detection),敬请期待~