尝试并排除(TypeError)
Try and Except (TypeError)
我想做的是在我的程序中创建一个菜单式的开始,让用户选择他们是想验证代码还是生成代码。代码如下所示:
choice = input("enter v for validate, or enter g for generate").lower()
try:
choice == "v" and "g"
except TypeError:
print("Not a valid choice! Try again")
restartCode() *#pre-defined function, d/w about this*
所以我希望我的程序在用户输入 "v" 或 "g" 以外的内容时输出该打印语句并执行该定义的函数(不包括他们输入这些字符的大写版本时).
我的 try 和 except 函数有问题,但只要用户输入的不是这 2 个字符,代码就会结束。
试试。
choice = input("enter v for validate, or enter g for generate").lower()
if (choice == "v") or (choice == "g"):
#do something
else :
print("Not a valid choice! Try again")
restartCode() #pre-defined function, d/w about this*
但是,如果您真的想坚持使用 try/except,您可以存储所需的输入,并与它们进行比较。该错误将是 KeyError 而不是 TypeError。
choice = input("enter v for validate, or enter g for generate").lower()
valid_choices = {'v':1, 'g':1}
try:
valid_choices[choice]
#do something
except:
KeyError
print("Not a valid choice! Try again")
restartCode() #pre-defined function, d/w about this
您对 try/except
的作用感到困惑。 try/except
在可能出现错误时使用。不会出现错误,因为程序中的所有内容都是有效的。仅当您的代码中存在执行错误时才会引发错误。错误不仅会在您需要时出现。
但是,你 希望在用户未输入有效选择时显示错误。您需要改用 if/else
逻辑,然后自己打印错误。作为旁注,行 choice == "v" and "g"
不会测试 choice 是否等于 'v'
或 'g'
。它测试选项 i 是否等于 v 以及字符串 'g'
是否为 "truthy"。你的真心话
if variable = value and True
我很确定这不是您想要的。以下是我将如何重写您的代码。
if choice.lower() in {"v", "g"}: # if choice is 'v' or 'g'
# do stuff
else: # otherwise
print("Not a valid choice! Try again") # print a custom error message.
问题不在于您的 try
和 except
,而在于您使用的是 try
和 except
。 try
块中的代码不会给您错误,因此永远不会触发 except
。您要使用 if
语句。
此外,您的条件只检查 choice == "v"
,因为它被评估为 (choice == "v") and "g"
,而 "g"
是一个长度不为 0 的字符串,所以总是 "truthy" (在布尔上下文中被视为 true)。 Anything and
True 不变,所以只有第一个测试有任何意义。进行此测试的最佳方法是使用 in
.
最后,您可以而且应该使用 while
循环来重复提示,直到用户输入有效的条目。
把它们放在一起,你想要这样的东西:
prompt = "Enter v for validate, or g for generate >"
choice = input(prompt).strip().lower()[:1] # take at most 1 character
while choice not in ("v", "g"):
print("Not a valid choice! Try again.")
choice = input(prompt).strip().lower()[:1]
如果您考虑如何概括代码以再次使用它(您可能会在脚本的其余部分中这样做),那么这样做既简单又有用。首先,你可以把 input
的东西分解成一个单独的函数,因为它被调用了两次:
def input1char(prompt):
return input(prompt + " >").strip().lower()[:1]
然后将 while 循环也分解成它自己的函数:
def validinput(prompt, options):
letters = tuple(options)
choice = input1char(prompt)
while choice not in options:
print("'%s' is not a valid choice! Try again." % choice)
choice = input1char(prompt)
return choice
然后你只需写:
choice = validinput("Enter v for validate, or g for generate", "vg")
我想做的是在我的程序中创建一个菜单式的开始,让用户选择他们是想验证代码还是生成代码。代码如下所示:
choice = input("enter v for validate, or enter g for generate").lower()
try:
choice == "v" and "g"
except TypeError:
print("Not a valid choice! Try again")
restartCode() *#pre-defined function, d/w about this*
所以我希望我的程序在用户输入 "v" 或 "g" 以外的内容时输出该打印语句并执行该定义的函数(不包括他们输入这些字符的大写版本时). 我的 try 和 except 函数有问题,但只要用户输入的不是这 2 个字符,代码就会结束。
试试。
choice = input("enter v for validate, or enter g for generate").lower()
if (choice == "v") or (choice == "g"):
#do something
else :
print("Not a valid choice! Try again")
restartCode() #pre-defined function, d/w about this*
但是,如果您真的想坚持使用 try/except,您可以存储所需的输入,并与它们进行比较。该错误将是 KeyError 而不是 TypeError。
choice = input("enter v for validate, or enter g for generate").lower()
valid_choices = {'v':1, 'g':1}
try:
valid_choices[choice]
#do something
except:
KeyError
print("Not a valid choice! Try again")
restartCode() #pre-defined function, d/w about this
您对 try/except
的作用感到困惑。 try/except
在可能出现错误时使用。不会出现错误,因为程序中的所有内容都是有效的。仅当您的代码中存在执行错误时才会引发错误。错误不仅会在您需要时出现。
你 希望在用户未输入有效选择时显示错误。您需要改用 if/else
逻辑,然后自己打印错误。作为旁注,行 choice == "v" and "g"
不会测试 choice 是否等于 'v'
或 'g'
。它测试选项 i 是否等于 v 以及字符串 'g'
是否为 "truthy"。你的真心话
if variable = value and True
我很确定这不是您想要的。以下是我将如何重写您的代码。
if choice.lower() in {"v", "g"}: # if choice is 'v' or 'g'
# do stuff
else: # otherwise
print("Not a valid choice! Try again") # print a custom error message.
问题不在于您的 try
和 except
,而在于您使用的是 try
和 except
。 try
块中的代码不会给您错误,因此永远不会触发 except
。您要使用 if
语句。
此外,您的条件只检查 choice == "v"
,因为它被评估为 (choice == "v") and "g"
,而 "g"
是一个长度不为 0 的字符串,所以总是 "truthy" (在布尔上下文中被视为 true)。 Anything and
True 不变,所以只有第一个测试有任何意义。进行此测试的最佳方法是使用 in
.
最后,您可以而且应该使用 while
循环来重复提示,直到用户输入有效的条目。
把它们放在一起,你想要这样的东西:
prompt = "Enter v for validate, or g for generate >"
choice = input(prompt).strip().lower()[:1] # take at most 1 character
while choice not in ("v", "g"):
print("Not a valid choice! Try again.")
choice = input(prompt).strip().lower()[:1]
如果您考虑如何概括代码以再次使用它(您可能会在脚本的其余部分中这样做),那么这样做既简单又有用。首先,你可以把 input
的东西分解成一个单独的函数,因为它被调用了两次:
def input1char(prompt):
return input(prompt + " >").strip().lower()[:1]
然后将 while 循环也分解成它自己的函数:
def validinput(prompt, options):
letters = tuple(options)
choice = input1char(prompt)
while choice not in options:
print("'%s' is not a valid choice! Try again." % choice)
choice = input1char(prompt)
return choice
然后你只需写:
choice = validinput("Enter v for validate, or g for generate", "vg")