除了

时间:2019-05-03 20:09:14

标签: python function try-catch except

我正在尝试制作菜单。我有一个不接受字符串输入的验证。如果值ins digital表示该函数运行良好,但是当输入为字符串时,出问题了

def menudos(diccionario, titulo):
    os.system('clear')
    list_menu = []
    if diccionario:
        print(titulo)
        for key in diccionario:
            list_menu.append(key)
        list_menu.append("Volver")
        for x in range(0, len(list_menu)):
            print(x, ": ", list_menu[x])
        try:
            opcion = int(input("Seleccionar> "))
        except:
            menudos(diccionario, titulo)
        return list_menu[opcion]

错误是:

Traceback (most recent call last):
  File "menudos.py", line 23, in <module>
    print(menudos(a, "Prueba"))
  File "menudos.py", line 21, in menudos
    return list_menu[opcion]
UnboundLocalError: local variable 'opcion' referenced before assignment

谢谢

2 个答案:

答案 0 :(得分:0)

问题在于,当您不提供int时,程序会引发异常,尝试将non-int转换为int,并且未将任何内容分配给var opcion。如果您想保护您的程序免于崩溃。在无限循环中执行try..except语句,以等待索引的正确格式。

答案 1 :(得分:0)

之所以引起特定的回溯,是因为在除外块中未定义opcion,但是您试图在通过除外块后返回list_menu[opcion]

相反,我建议您使用一个while循环,该循环将永远运行,直到您从用户那里获得可接受的输入为止。

我对用户菜单的处理方式始终是将菜单选项的打印与捕获用户输入分开。

类似的东西:

def print_menu():
    print("Please make a selection:")
    print("1. Do item #1")
    print("2. Do item #2")
    # ...etc....

def get_user_input():
    selection = None
    while selection is None:
        try:
            selection = int(input("Selection: "))
            return selection
        except:
            print("You selected an invalid choice. Please choose again.")
            print_menu()

希望这会有所帮助!

编辑:Also see this question on recursion in Python。 Python默认默认限制为1000个递归调用-因此,假设您现有的代码有效,则用户可能输入1000个不正确的条目并破坏程序。