处理超出最大递归深度

Posted

技术标签:

【中文标题】处理超出最大递归深度【英文标题】:Handling maximum recursion depth exceeded 【发布时间】:2015-02-03 22:47:09 【问题描述】:

我创建了一个使用递归来解决简单迷宫的程序。如果出现相当复杂的迷宫,我会得到最大递归深度误差。我已经在这个网站上搜索了那个错误并阅读了主题,所以我相信我对正在发生的事情有一个大致的了解。

与我看到的其他线程不同,我并不想增加递归限制。 sys.setrecursionlimit() 不是我要找的。我希望能够处理溢出,而不是崩溃让程序打印一条消息(print("Sorry but this maze solver was not able to finish analyzing the maze due to recursion limits))并关闭。

我知道使用 try 和 except 来处理错误,但我不确定是否可以合并它来处理最大递归深度错误。

【问题讨论】:

请注意,您通常可以使用队列数据结构将任何递归算法实现为非递归算法。这是绕过递归限制的一种方法。 您好,感谢 JME 提供的信息。我需要对这个作业使用递归(这是一个类问题) 【参考方案1】:

最大递归深度错误只是另一个例外;你可以赶上RecursionError exception(Python 3.5 或更高版本):

try:
    solveMaze(maze)
except RecursionError as re:
    print('Sorry but this maze solver was not able to finish '
          'analyzing the maze: '.format(re.args[0]))

我已将附加到运行时异常的错误消息合并;对于 maximum recursion depth exceeded 的递归错误。

如果需要支持 3.5 之前的 Python 版本,可以捕获基类 RuntimeError。如果您担心捕获不是递归深度错误的运行时错误,您可以自省.args[0] 值:

try:
    solveMaze(maze)
except RuntimeError as re:
    if re.args[0] != 'maximum recursion depth exceeded':
        # different type of runtime error
        raise
    print('Sorry but this maze solver was not able to finish '
          'analyzing the maze: '.format(re.args[0]))

选项演示:

>>> def infinity(): return infinity()
... 
>>> try:
...     infinity()
... except RecursionError as re:
...     print('Oopsie: '.format(re.args[0]))
... 
Oopsie: maximum recursion depth exceeded
>>> def alter_dict_size():
...     dct = 'foo': 'bar'
...     for key in dct:
...         del dct['foo']
... 
>>> try:
...     alter_dict_size()
... except RuntimeError as re:
...     print('Oopsie: '.format(re.args[0]))
... 
Oopsie: dictionary changed size during iteration
>>> try:
...     infinity()
... except RuntimeError as re:
...     if re.args[0] != 'maximum recursion depth exceeded':
...         raise
...     print('Oopsie: '.format(re.args[0]))
... 
Oopsie: maximum recursion depth exceeded
>>> try:
...     alter_dict_size()
... except RuntimeError as re:
...     if re.args[0] != 'maximum recursion depth exceeded':
...         raise
...     print('Oopsie: '.format(re.args[0]))
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 3, in alter_dict_size
RuntimeError: dictionary changed size during iteration

更改字典大小也会引发RuntimeError 异常,但测试生成的异常消息可以让您区分。

【讨论】:

如果你想捕捉递归错误,捕捉RecursionError @SolomonUcko:感谢您指出这一点。这是一个 新的 例外,在 Python 3.5 中添加,于 2015 年 9 月首次发布。我已将其添加到我的答案中。

以上是关于处理超出最大递归深度的主要内容,如果未能解决你的问题,请参考以下文章

/graphql 处的递归错误。超出最大递归深度

Python:超出最大递归深度

RecursionError:超出最大递归深度

Pyinstaller RecursionError:超出最大递归深度

Pyinstaller 超出最大递归深度

pyinstaller递归错误:超出最大递归深度