尝试并排除(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.

问题不在于您的 tryexcept,而在于您使用的是 tryexcepttry 块中的代码不会给您错误,因此永远不会触发 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")