我正在尝试为一个学校项目创建一个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()
当用户输入一个浮点值或整数值作为“guess”时,这个方法很好地工作,如果用户一开始输入的不是数字,我的Try-Except子句似乎会捕捉到,但是程序似乎也会继续执行“if”语句。我收到一个类型错误,它说“str”和“float”实例之间不支持“<;”。你知道吗
我尝试过在Try Except子句中包含整个循环,但这不起作用。我不知道我做错了什么。非常感谢您的帮助。你知道吗
首先,捕捉异常的方式是无效的。表达式
ValueError or TypeError
的值总是ValueError
,因为对于两个非False
参数,短路就是这样工作的。要获得两种类型的错误来触发块,请使用tuple
,如(ValueError, TypeError)
。你知道吗问题是,即使在代码中捕获到异常,它也会继续进入
if
块。您有四个简单的选择来避免这种情况:在
except
块中使用continue
语句告诉循环继续,而不处理以下if
结构:这可能是四个选项中最干净、最简单的。
不要使用
except
块来响应错误。相反,依赖于这样一个事实:guess的值仍然是""
。要使其工作,您必须在循环的每次迭代中预先初始化guess
,而不是在循环外初始化一次:我个人并不喜欢这种方法,因为它需要在每个循环中进行初始化。这还不错,只是没有选项1那么干净。你知道吗
此选项的一个变体是直接检查
guess
是否是str
的实例。然后可以将其初始化为用户输入,从而使转换操作更简洁:使用
else
子句,它是try
块的可能元素之一。如果未发生异常,则只执行:虽然这个选项创建了一个附加的缩进层,但是对于那些普通的
continue
不起作用的情况,有必要记住这个选项。有时,当您需要在分支之前对错误和非错误情况进行额外处理时,会发生这种情况。将整个
if
块放入try
块。这样,只有在没有错误的情况下才会执行。这是我最不喜欢的选项,因为我喜欢我的try
块被尽可能地修剪,以避免捕获我不想捕获的异常。在Python中,try
相对于Java这样的语言来说,性能杀手的作用相对较小,因此对于简单的情况,这仍然是一个选项:尝试使用else语句。你知道吗
除了捕获打印外,请让脚本继续运行。它将继续执行所有if语句,即使捕获被命中。您要做的是在点击except时跳过函数的主要逻辑。使用try-catch ELSE-finally块的ELSE子句。你知道吗
相关问题 更多 >
编程相关推荐