模块中的异常处理

时间:2015-06-21 21:22:35

标签: python exception-handling module

在迈克尔道森的书“绝对初学者的Python编程”中,有一章关于制作二十一点游戏。游戏分为3个不同的文件:

  1. cards.py模块与基本纸牌游戏课程(卡,手,甲板)
  2. games.py模块,包含基本的Player类和2个函数 - ask_number()ask_yes_no()
  3. blackjack.py包含运行游戏的代码,还有一些类继承自cards.pygames.py
  4. 中的类

    我正在尝试在ask_number()内的函数games.py中实现异常处理。这个功能最初是:

    def ask_number(question, low, high):
      response = None
      while response not in range(low, high):
          response = int(input(question))
          return response
    

    此函数在blackjack.py的{​​{1}}开头调用,如下所示:

    main()

    在模块中的函数中,我想检查是否输入了数字,如果输入无法转换为整数,则输入正确的值,直到我输入正确的值,因此函数返回一个整数。我做了什么:

    import games
    import cards
    ...
    def main(): 
        ...
        names = []
        number = games.ask_number("How many players? (1 - 7): ", low=1, high=8)
        for i in range(number):
            name = input("Enter player name: ")
            names.append(name)
    

    当我在模块def ask_number(question, low, high): response = None while response not in range(low, high): try: response = int(input(question)) except ValueError: print("Looks like it's not a number!") else: return response 中调用函数时,这很有用。但是当在games.py函数中的blackjack.py内调用时,如果我输入任何数字而不是数字,它仍然会引发ValueError,好像没有尝试/除了:

    main()

    我无法理解为什么。我错过了什么?

1 个答案:

答案 0 :(得分:0)

嗯,当您使用for进行range()循环时,括号中的任何内容都必须是整数。没有浮点数(小数)或字符串(str)。由于s是一个字符串,因此会自动引发错误。例如,当x具有整数时,以下内容将起作用:

x = 10
for i in range(x):
    print i

但如果x是一个字符串,那么它将不起作用:

x = 'This does not work at all!!!'
for i in range(x):
    print i

因此,您需要确保代码中的number在通过添加另一个fortry块进入except循环之前是一个整数:< / p>

import games
import cards
...
def main(): 
    ...
    names = []
    number = games.ask_number("How many players? (1 - 7): ", low=1, high=8)
    try:
        test = int(number)           #See if number is an integer
    except ValueError:
        print('That is not a number! Please type in a whole number.') #Tell user to type in an integer
    else:
        pass                         #Skip to next line, don't do anything else
    for i in range(number):
        name = input("Enter player name: ")
        names.append(name)