在python3中再次调用函数之前,如何清除异常上的当前调用堆栈?

How to clear the current call stack on exception before re calling the function again in python3?

提问人:Aaditya Jindal 提问时间:7/17/2023 最后编辑:Aaditya Jindal 更新时间:7/17/2023 访问量:26

问:

我对 python 和错误处理非常陌生。目前,我已经编写了一个程序,用于访问用户的电子邮件帐户并获取所请求电子邮件的内容。我使用基于数字的菜单来设置过滤器以选择所需的电子邮件。与 python 中的任何数字输入一样,这会产生需要处理的潜力。为此,我使用 except 语句。在 except 语句中,我告知用户该字段需要数字输入,然后调用函数再次接受输入,从而导致尾递归。但是,我意识到这不是一个理想的解决方案,因为最终,如果产生足够的错误,它会导致缓冲流。ValueError

所以,我的问题是,有没有更好的方法来实现同样的目标。例如,有没有办法清除当前调用堆栈,然后从头开始重新启动程序,以防止缓冲区过流?

感谢您的任何建议。

我试图查找几篇关于堆栈而不是流和其他方面的文章,但它们似乎都没有涵盖我面临的问题。

python-3.x 异常 缓冲区溢出

评论

1赞 Cmd858 7/17/2023
一般来说,你希望你的程序遵循一个一致的过程,这就是为什么你所描述的实际上只是没有完成。你真正想做的是把你的选择菜单放在一个块中,这样它就会永远循环。然后,您可以在循环中调用登录函数,并且可以通过提前将函数返回到主循环中来处理您描述的任何错误,以便可以再次调用它而不会永远推高堆栈。while True
0赞 Aaditya Jindal 7/17/2023
哦。谢谢你的回答。您能否分享一个代码示例来描述您所说的内容?
0赞 Community 7/17/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。

答:

0赞 Cmd858 7/17/2023 #1

这是一个相当基本的例子,但我认为我很好地展示了我在说什么

def getEmail():
    # email logic
    inp = int(input('Input a number >>> '))  # conversion that can throw an error
    return inp


while 1:  # loops forever
    try:
        print(getEmail())
    except ValueError:
        print('Numeric input required')

这是一个很好的解决方案,因为异常会自动推送堆栈,这意味着您不必在函数内部调用函数,而是可以让它完成,然后再次调用它。