我正在尝试用Python为学校项目创建一个猜数字游戏。我已经制作了一个基本游戏,可以很好地工作,但我想添加一些异常处理,以防用户输入错误的内容。例如,这是我代码的一部分:
def Normal_Guess():
number = round(random.uniform(0.0, 100.0),2)
guess = ""
while guess != number:
try:
guess = float(input("Please guess a number between 0 and 100: "))
except ValueError or TypeError:
print ("That isn't even a number!")
if guess < number and guess >= 0:
print ("You need to guess higher!")
elif guess > number and guess <= 100:
print ("You need to guess lower!")
elif guess == number:
print("Congratulations! You guessed the number!")
elif guess < 0 or guess > 100:
print ("The number you guessed is not between 0 and 100")
else:
print("That isn't even a number!")
New_Game()
当用户输入浮点数或整数值作为"猜测"时,这工作正常,如果用户一开始输入的数字之外的任何内容,我拥有的 Try-Except 子句似乎可以捕获,但程序似乎也继续"if"语句。我收到一个TypeError,说"'str'和'float'的实例之间不支持'<'"。
我尝试在 Try-Except 子句中包含整个循环,但这不起作用。我不知道我做错了什么。任何帮助都非常感谢。
首先,您捕获异常的方式是无效的。表达式ValueError or TypeError
的值总是ValueError
,因为这就是短路与两个非False
参数的工作方式。要使这两种类型的错误都触发块,请使用tuple
,例如(ValueError, TypeError)
。
问题是,即使代码中捕获了异常,它也会继续到if
块。您有四个简单的选项可以避免这种情况:
-
在
except
块中使用continue
语句告诉循环继续前进,而不处理以下if
结构:尝试: guess = float(input("請猜一個 0 到 100 之間的數字:")) 除了(ValueError, TypeError): 打印("这甚至不是一个数字!继续
这可能是四个选项中最干净和最简单的一个。
-
不要使用
except
块来响应错误。相反,依靠猜测的价值仍然""
的事实。为此,您必须在循环的每次迭代中预先初始化guess
,而不是在循环外一次:而猜测!=数字:猜测 =">尝试: guess = float(input("請猜一個 0 到 100 之間的數字:")) 除了(ValueError, TypeError):如果猜测则通过 == ": 打印("这甚至不是一个数字! Elif猜测<数字并猜测>= 0: ...数字并猜测>
就个人而言,我不喜欢这种方法,因为它需要在每个循环中进行初始化。这还不错,只是不如选项 #1 干净。
此选项的变体是直接检查
guess
是否是str
的实例。然后,您可以将其初始化为用户输入,使转换操作更清晰:而猜测!=数字:guess = input("请猜一个介于 0 和 100 之间的数字:")try:猜测 = 浮点数(猜测) 除了(ValueError, TypeError):如果isinstance(guess, str) 则通过: 打印("这甚至不是一个数字! Elif猜测<数字并猜测>= 0: ...数字并猜测>
-
使用
else
子句,该子句是try
块的可能元素之一。仅当未发生异常时,才会执行此子句:尝试: guess = float(input("請猜一個 0 到 100 之間的數字:")) 除了(ValueError, TypeError): 打印("这甚至不是一个数字!否则:如果猜<数字并猜测>= 0:数字并猜测>...
虽然此选项会创建额外的缩进层,但对于普通
continue
不起作用的情况,值得记住。当您需要在分支之前对错误和非错误情况进行其他处理时,有时会发生这种情况。 -
将整个
if
块放入try
块中。这样,只有在没有错误的情况下才会执行。这是我最不喜欢的选项,因为我希望我的try
块尽可能精简,以避免捕获我不打算的异常。在 Python 中,try
的性能杀手比 Java 等语言要小,所以对于你的简单情况,这仍然是一个选择:尝试: guess = float(input("請猜一個 0 到 100 之間的數字:"))如果猜<数字并猜测>= 0:数字并猜测>... 除了(ValueError, TypeError): 打印("这甚至不是一个数字!
尝试使用 else 语句。
您的 except 捕获打印,但让脚本继续运行。 即使捕获被击中,它也将继续所有 if 语句。您要做的是在命中 except 时跳过函数的主逻辑。使用 try-catch-else-finally 块的ELSE子句。
import random
def Normal_Guess():
number = round(random.uniform(0.0, 100.0),2)
guess = ""
while guess != number:
try:
guess = float(input("Please guess a number between 0 and 100: "))
except (ValueError, TypeError):
print ("That isn't even a number!")
else:
if guess < number and guess >= 0:
print ("You need to guess higher!")
elif guess > number and guess <= 100:
print ("You need to guess lower!")
elif guess == number:
print("Congratulations! You guessed the number!")
elif guess < 0 or guess > 100:
print ("The number you guessed is not between 0 and 100")
else:
print("That isn't even a number!")
Normal_Guess()