递归函数以错误处理请求Python用户输入

时间:2019-05-10 19:15:59

标签: python error-handling user-input

我正在编写一个小的Python脚本,该脚本需要用户传递的信息。由于我的脚本的某些部分可能会引发异常,因此如果用户输入的格式错误,则会破坏脚本,因此我想事先进行检查。无论如何,这是一个有用的措施。为了获得更好的用户体验,如果输入格式错误,我不希望脚本被中断。相反,应该重新提出问题。

因此,我为每个用户输入定义了一个函数,该函数将在进行下一步之前检查输入。通过tryexcept错误处理方法进行检查,以确保脚本不被中断。

这是此类功能的最小示例:

def ask_for_int( prompt = "Please enter an integer:\n" ):
    user_input = input( prompt ).strip()

    # Check if the value can be transformed into a float
    try:
        return int( user_input )
    except:
        ask_for_int( prompt = "You need to pass an integer:\n" )

some_number = ask_for_int()

只要输入整数,此代码就可以正常工作。如果将字符串传递给它,它还会识别TypeException并询问整数。不幸的是,尽管some_number变量现在不保存我传递的整数,但为空。

为清楚起见,请看以下内容:

让我们首先在上一个示例的末尾添加一个print( 'You passed the valid integer: %s' % some_number )。如果我们现在将123传递给提示符,则打印返回123。哇!

但是,如果我们通过abc,脚本将拒绝我们的输入并要求输入新的数字,即except在这里工作。现在让我们完成此任务,并实际上传递一个整数,例如321。当然,打印结果应该返回321,因为那是接受的整数,不是吗?好吧,很遗憾,输出为None

这是原始输出:

传递整数

Please enter an integer:
123
You passed the valid integer: 123

首先传递字符串,然后传递整数

Please enter an integer:
abc
You need to pass an integer:
321
You passed the valid integer: None

2 个答案:

答案 0 :(得分:3)

您没有返回递归调用的结果,因此该函数返回None

您在哪里:

ask_for_int( prompt = "You need to pass an integer:\n" )

写:

return ask_for_int( prompt = "You need to pass an integer:\n" )

答案 1 :(得分:2)

这是因为except块未返回任何值。 我建议您将其更改为:

    try:
        user_input = int(user_input)
    except:
        user_input = ask_for_int(prompt="You need to pass an integer:\n")
    return user_input