Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模块中的异常处理_Python_Exception Handling_Module - Fatal编程技术网

Python 模块中的异常处理

Python 模块中的异常处理,python,exception-handling,module,Python,Exception Handling,Module,在迈克尔·道森的《为绝对初学者编写Python编程》一书中,有一章是关于制作21点游戏的。游戏分为3个不同的文件: cards.py模块,包含基本的卡牌游戏类(卡牌、手牌、牌组) games.py模块,带有基本玩家类和两个函数-ask\u number(),ask\u yes\u no() blackjack.py带有运行游戏的代码,以及从cards.py和games.py中继承的一些类 我试图在games.py中的函数ask\u number()中实现异常处理。此功能最初: def ask_n

在迈克尔·道森的《为绝对初学者编写Python编程》一书中,有一章是关于制作21点游戏的。游戏分为3个不同的文件:

  • cards.py
    模块,包含基本的卡牌游戏类(卡牌、手牌、牌组)
  • games.py
    模块,带有基本玩家类和两个函数-
    ask\u number()
    ask\u yes\u no()
  • blackjack.py
    带有运行游戏的代码,以及从
    cards.py
    games.py中继承的一些类
  • 我试图在
    games.py
    中的函数
    ask\u number()
    中实现异常处理。此功能最初:

    def ask_number(question, low, high):
      response = None
      while response not in range(low, high):
          response = int(input(question))
          return response
    
    此函数在其
    main()
    开头的
    blackjack.py
    中调用,如下所示:

    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)
    
    在模块中的函数中,我想检查是否输入了一个数字,如果输入不能转换为整数,则检查ValueError除外,直到我输入了正确的值,因此函数返回了一个整数。我所做的:

    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
    中调用函数时,这工作得很好。但是当在
    main()
    函数中的
    blackjack.py
    中调用时,如果我输入除数字以外的任何内容,它仍然会引发ValueError,就像没有try/except一样:

    Traceback (most recent call last): 
      File "D:/My Projects/BlackJack.py", line 164, in <module>
        main()
      File "D:/My Projects/BlackJack.py", line 150, in main
        number = games.ask_number("How many players? (1 - 7): ", low=1, high=8)
      File "D:/My Projects/games.py", line 21, in ask_number
        response = int(input(question))
    ValueError: invalid literal for int() with base 10: 's'
    
    回溯(最近一次呼叫最后一次):
    文件“D:/My Projects/BlackJack.py”,第164行,在
    main()
    文件“D:/My Projects/BlackJack.py”,第150行,主视图
    数字=游戏。询问数字(“有多少玩家?(1-7):”,低=1,高=8)
    文件“D:/myprojects/games.py”,第21行,ask_编号
    回答=int(输入(问题))
    ValueError:基数为10的int()的文本无效:“s”
    

    我就是不明白为什么。我遗漏了什么?

    问题是,当您使用
    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
    
    因此,在将代码放入
    for
    循环之前,您需要确保代码中的
    number
    是一个整数,方法是添加另一个
    try
    ,但
    块除外:

    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)
    

    问题是,当您使用
    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
    
    因此,在将代码放入
    for
    循环之前,您需要确保代码中的
    number
    是一个整数,方法是添加另一个
    try
    ,但
    块除外:

    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)
    

    如果您使用的是Python2.x,您是否尝试过使用
    raw\u input
    呢?这是Python3.x,因为OP使用的是
    print()
    。如果您使用的是Python2.x,您是否尝试过使用
    raw\u input
    呢?这是Python3.x,因为OP使用的是
    print()
    。好吧,我刚刚尝试过这个,似乎也不起作用。问题是,
    ValueError
    仍然是在
    number=games.ask_number()
    ,因此
    number
    不会被传递到
    for i in range()
    。我想知道为什么
    ask_number()
    本身没有除了ValueError之外,尽管它有点应该这样做。有一个
    while
    循环,使用
    try/except
    请求一个合适的值,直到得到一个为止。只有这样,它才应该被传递到
    ,因为我在范围(number)
    中,我刚刚尝试了这个,似乎也不起作用。问题是,
    ValueError
    仍然是在
    number=games.ask_number()
    ,因此
    number
    不会被传递到
    for i in range()
    。我想知道为什么
    ask_number()
    本身没有除了ValueError之外,尽管它有点应该这样做。有一个
    while
    循环,使用
    try/except
    请求一个合适的值,直到得到一个为止。只有这样,才应该将范围(编号)中的i传递到