一、程序的异常处理
异常处理是现代编程语言不可或缺的能力,它已经成为衡量一门编程语言是否已经成熟和健壮的标准之一。
例如在二级编程题中有一个‘猜数字’游戏,如下
import random
target = random.randint(1,1000)
count = 0
while True:
guess = eval(input('请输入一个猜测的整数(1至1000):'))
count = count+1
if guess > target:
print('猜大了')
elif guess < target:
print("猜小了")
else:
print("猜对了")
break
print("本轮猜测的次数是:{}".format(count))
该游戏会产生一个1-1000的随机数,然后请用户循环猜这个数字,对于每个答案只回答"猜大了"或"猜小了",直到猜准确为止,输出用户的猜测次数
下面附上运行结果
请输入一个猜测的整数(1至1000):500
猜大了
请输入一个猜测的整数(1至1000):100
猜大了
请输入一个猜测的整数(1至1000):1
猜小了
请输入一个猜测的整数(1至1000):abc
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-8c063bff509d> in <module>
3 count = 0
4 while True:
----> 5 guess = eval(input('请输入一个猜测的整数(1至1000):'))
6 count = count+1
7 if guess > target:
<string> in <module>
NameError: name 'abc' is not defined
可以看到我们无法保证用户会输入什么数据,输入有误程序就会报错,这时异常处理的作用就体现出来了
仔细观察下面的代码
import random
target = random.randint(1,1000)
count = 0
while True:
try:
guess = eval(input('请输入一个猜测的整数(1至1000):'))
except:
print("输入格式有误,请重新输入")
continue
count = count+1
if guess > target:
print('猜大了')
elif guess < target:
print("猜小了")
else:
print("猜对了")
break
print("本轮猜测的次数是:{}".format(count))
可以看到在第五行和第七行分别加了try和except语句
运行结果如下:
请输入一个猜测的整数(1至1000):500
猜大了
请输入一个猜测的整数(1至1000):100
猜大了
请输入一个猜测的整数(1至1000):1
猜小了
请输入一个猜测的整数(1至1000):abc
输入格式有误,请重新输入
请输入一个猜测的整数(1至1000):
结果显而易见,所以程序的异常处理是非常有必要的
二、异常的高级用法
其实程序的异常处理还有一些略微高级的用法,这些用法也十分常用。
例题如下:
try:
alp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
idx = eval(input("请输入一个整数:"))
print(alp[idx])
except NameError:
print("输入错误,请输入一个0-25的整数")
except:
print("其它错误")
运行结果如下:
请输入一个整数:NO
输入错误,请输入一个0-25的整数
请输入一个整数:100
其它错误
除了try和except保留字外,异常语句还可以与else和finally保留字配合使用,语法格式如下:
try:
<语句块1>
except <异常类型1>:
<语句块2>
else:
<语句块3>
finally:
<语句块4>
当try中的语句块1正常执行结束且没有发生异常时,else中的语句块3执行,可以看作是对try语句块正常执行后的一种追加处理。finally语句块则不同,无论try中的语句块1是否发生异常,语句块4都会执行,可以将程序执行语句块1的一些收尾工作放在这里。
小伙伴们赶快找个例子练练手吧