python异常的示例使用
python异常处理实例
以狼人游戏为例,游戏中主要由狼人,特殊的村民,普通村民。狼人可以杀所有村民,村民则是要找出隐藏在村民里的狼人,总的来说就是身份猜测,推理这个人真正身份。具体在这里设计说明如下:
- 自定义两个异常类,以控制角色猜测的错误次数和判断胜利条件。
- 定义玩家与角色,并将两者随机匹配,使得每一次游戏的玩家角色不会重复。
- 每个玩家只能对其身份进行两次,总错误次数不得超多5次,否则游戏结束。
- 如果每个玩家的身份都猜对了,则游戏胜利。
根据上述设定的游戏规则,编写游戏的功能代码,如下所示:
import random class MuchError(Exception): pass class Victory(Exception): pass #定义玩家与角色 player = ['小黄','小黑','小白','小红'] role = ['女巫','猎人','狼人','村民','守卫','长老','预言家','白狼王'] #将玩家与角色的顺序打乱并匹配 player = random.sample(player,len(player)) #这里的random.sample()函数用法是截取固定长度的随机数 role = random.sample(role,len(player)) print('游戏中全部身份有:' + ',' .join(role)) #以','为分隔,打印所有的随机role matching = {} #定义一个空字典 for t in range(len(player)): matching[player[t]] = role[t] try: result, err = 0,0 for t in player: for i in range(2): guess = input('你认为' + 't' '的身份是: ') if guess == matching[t]: result += 1 print('你猜对了') break #终止本次循环,进入新的循环。 else: err += 1 print('猜错了,你还有' + str(1-i) + '次机会') if err > 5: raise MuchError('错误次数已超出5次,游戏结束') #手动抛出异常MuchError if result == len(player): raise Victory('恭喜你,全部猜对了') #手动抛出异常Victory except MuchError as errInfo: print(errInfo)
结果:
整段代码主要分为 3 部分: 向定义异常类、 玩家与角色设定与匹配和游戏逻辑。 其中
游戏逻辑是整个游戏的核心代码, 它是在一个try …except机制完成。
l 首先将每位玩家进行循环遍历, 保证每位玩家都可以进行身份猜测。
l 然后对每位玩家再循环两次, 代表每位玩家的身份有两次猜测机会, 每循环一次都会执行if…else判断,判断猜测结果是否正确。
l 最后分别判断错误次数 err 和正确次数 result. 如果错误次数大于 5,抛出内定义异常 MuchError, 直接终止 try里面的所有 for 循环, 并控制程序执行。 如果正确次数等于4, 也就是全部玩家的身份都猜测正确了, 就会抛出自定义 Victory 异常,程序结束。
异常机制是对程序运行过程中出现错误而进行处理操作,一般情况下,程序在运行中出现错误会停止运行并发送错误信息, 倘若在 程序中加入异常机制,当程序运行中出现错误的时候,它会捕捉错误信息并执行相应的 处理, 这样能使 程序继续保持运行状态。
完整的异常机制语法由4个关键词组成:try、except、else和finallyo 每个关键词都有不同的作用,其中关键词 try和except是必不可少的,else和finally可以根据实际需求来决定是否添加。 4个关键词的具体说明如下。
• try: 用于监测程序代码是否出现异常, 监测的代码可以是程序的全部代码或者程序的 部分代码.
• except: 用于捕捉异常信息并对异常进行处理, 若关键词后面设置异常类型, 在捕捉过 程中根据异常类型而选择相应的except.
• else:如果关键词try的代码里面没有出现异常, 程序就会执行此关键词里面的代码.
• finally: 不管关键词try是否出现异常, 当关键词try、except或else的代码执行完成后, 最终程序会自动执行此关键词里面的代码.
异常一般由程序在运行过程中遇到错误的时候而生成的,但有时候我们需要自己抛出异常信息,让程序去捕捉和处理此异常类,成为自定义异常,自定义异常除了监测错误之外,还可以用于代码的布局设计和程序的逻辑控制,通过抛出异常可执行不同的代码块。自定义异常抛出由关键词raise实现,关键词后面是填写异常的类型及异常信息。
如果早自定义异常抛出或异常捕捉的时候不想使用python内置的异常类,也可以自定义一个异常类,只要使自定义异常类继承Exception类即可。