python异常的示例使用

python异常处理实例

以狼人游戏为例,游戏中主要由狼人,特殊的村民,普通村民。狼人可以杀所有村民,村民则是要找出隐藏在村民里的狼人,总的来说就是身份猜测,推理这个人真正身份。具体在这里设计说明如下:

  1. 自定义两个异常类,以控制角色猜测的错误次数和判断胜利条件。
  2. 定义玩家与角色,并将两者随机匹配,使得每一次游戏的玩家角色不会重复。
  3. 每个玩家只能对其身份进行两次,总错误次数不得超多5次,否则游戏结束。
  4. 如果每个玩家的身份都猜对了,则游戏胜利。

 

根据上述设定的游戏规则,编写游戏的功能代码,如下所示:

 

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类即可。

posted @ 2021-12-01 11:52  头发重要  阅读(89)  评论(0编辑  收藏  举报