我知道这是基本的,但实际上我甚至不知道自己做错了什么。
while True:
try:
end=int(input("If You Dont Want To Buy Anything Press 1 To Exit\nOr If You Would Like To Try Again Please Press 2"))
except ValueError:
print("\nPlease Enter Only 1 Or 2")
if end==1:
exit()
elif end==2:
continue
我确实在开始时定义了结尾,但错误是NameError: name 'end' is not defined
我甚至试图将结束视为全局。
答案 0 :(得分:4)
end
仅在没有ValueError
时分配。如果int()
引发异常,则分配永远不会发生。
测试end
内的有效try
值 end
(以便您知道没有引发任何异常),或者首先将默认值分配给1
例如,如果输入了2
或while True:
try:
end=int(input("If You Dont Want To Buy Anything Press 1 To Exit\nOr If You Would Like To Try Again Please Press 2"))
if end==1:
exit()
elif end==2:
break
except ValueError:
pass
print("\nPlease Enter Only 1 Or 2")
以外的任何内容,则以下内容不会抛出您的例外情况,仍会提示用户重新输入该号码:
print()
请注意,我已将except
移动到外 break
块;如果抛出异常或未执行exit()
或break
,则会打印出来。请注意,我在此使用continue
而不是while True
来退出continue
循环; private string PrettyPrintGenericTypeName(Type p)
{
if (p.IsGenericType) {
var simpleName = p.Name.Substring(0, p.Name.IndexOf('`'));
var genericTypeParams = p.GenericTypeArguments.Select(PrettyPrintGenericTypeName).ToList();
return string.Format("{0}<{1}>", simpleName, string.Join(", ", genericTypeParams));
} else {
return p.Name;
}
}
将开始下一次迭代,提示用户再次输入数字。
答案 1 :(得分:1)
其他人解释了这个问题;这是一个规范的解决方案。这符合我们许多人对此过程的看法: - 抓住回复 - 直到我收到法律回复 - ...告诉用户出了什么问题 - ......获得新回复
input_prompt = "If You Don't Want To Buy Anything Press 1 To Exit\nOr If You Would Like To Try Again Please Press 2"
response = input(input_prompt)
while response != '1' and response != '2':
print("\nPlease Enter Only 1 Or 2")
response = input(input_prompt)
end = int(reponse)
这没有不自然的循环退出(更难以遵循和维护),也没有异常处理(慢)。
答案 2 :(得分:0)
它尝试为end分配一个值,但是捕获一个ValueError,并且在except之后它试图查看'end'是什么,但是由于Exception,它从未被赋值。
答案 3 :(得分:0)
如果int(input(...))
失败,则会引发ValueError
。这是在分配end
之前发生的。在错误处理中添加另一个控制语句,例如
while True:
try:
end=int(input("If You Dont Want To Buy Anything Press 1 To Exit\nOr If You Would Like To Try Again Please Press 2"))
except ValueError:
print("\nPlease Enter Only 1 Or 2")
continue # ask again
if end==1:
exit()
elif end==2:
continue