Python 模块中的异常处理
在迈克尔·道森的《为绝对初学者编写Python编程》一书中,有一章是关于制作21点游戏的。游戏分为3个不同的文件: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
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传递到