【问题标题】:Try and Except (TypeError)尝试并排除 (TypeError)
【发布时间】:2017-03-01 14:34:47
【问题描述】:

我要做的是在我的程序中创建一个菜单样式的开始,让用户选择是要验证代码还是生成代码。代码如下所示:

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 函数有问题,但是每当用户输入这两个字符以外的内容时,代码就会结束。

【问题讨论】:

  • 使用if else 语句
  • 没有抛出异常,因此 except 子句永远不会被执行。使用@letsc 建议的if else 类型逻辑。
  • if choice == 'v' or choice == 'g':

标签: python try-catch typeerror except


【解决方案1】:

试试吧。

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 语句,然后使用 while 循环说“while 选择 == v”等等,但这既简单又有效。
【解决方案2】:

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

但是,

您希望在用户未输入有效选择时显示错误。您需要改用if/else 逻辑,并自己打印错误。作为旁注,choice == "v" and "g" 行不测试选择是否等于'v' 或'g'。它测试选项 i 是否等于 v 以及字符串 'g' 是否为“真”。你的原话

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.

【讨论】:

  • choice in "vg" 有点像陷阱。试试print("" in "vg")。 :-)
  • @kindall 啊!感谢您了解这一点;)有时我会为了自己的利益而努力变得聪明。
  • 就在上周,我被它抓住了。 :-)
【解决方案3】:

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

此外,您的条件仅检查 choice == "v",因为它被评估为 (choice == "v") and "g",而 "g" 是一个长度不为 0 的字符串,因此始终是“真实的”(在布尔上下文中被视为 true)。任何andTrue 都是不变的,所以只有第一个测试有任何意义。进行此测试的最佳方法是使用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")

【讨论】:

    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多