尝试和除外(TypeError)

时间:2016-10-19 19:35:50

标签: python try-catch typeerror except

我尝试做的是在我的程序中创建菜单式启动,让用户选择是否要验证代码或生成代码。代码如下所示:

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*

所以我希望我的程序输出那个print语句,并在用户输入" v"以外的其他内容时执行该定义的函数。或" g" (不包括他们输入这些字符的大写版本时)。 我的try和except函数有问题,但每当用户输入除2个字符以外的东西时,代码就会结束。

3 个答案:

答案 0 :(得分: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*

但是,如果你真的想坚持尝试/除了你可以存储所需的输入,并与它们进行比较。错误将是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

答案 1 :(得分:2)

您对try/except的作用感到困惑。当可能引发错误时使用try/except。不会出现错误,因为程序中的所有内容都有效。仅当代码中存在执行错误时才会引发错误。错误不仅仅是在你需要的时候提出的。

但是,如果用户未输入有效选项,则希望显示错误。您需要使用if/else逻辑,并自行打印错误。作为旁注,行choice == "v" and "g"不会测试选择是否等于'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.

答案 2 :(得分:2)

问题不在于您的tryexcept,而在于您完全使用tryexcepttry块中的代码不会给您错误,因此永远不会触发except。您想使用if语句。

此外,您的条件仅检查choice == "v",因为它被评估为(choice == "v") and "g",而"g"是不是长度为0的字符串,因此始终是“真实的”(视为真实在布尔上下文中)。任何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")