处理最大递归深度超出限制

8
我创建了一个使用递归来解决简单迷宫问题的程序。在遇到比较复杂的迷宫时,会出现最大递归深度错误。我已经在这个网站上搜索并阅读了相关线程,因此我相信我对发生的情况有一个基本的理解。
与我看到的其他线程不同,我不是试图增加递归限制。sys.setrecursionlimit() 不是我要找的东西。我希望能够处理溢出,并且在程序崩溃之前打印一条消息(print("Sorry but this maze solver was not able to finish analyzing the maze due to recursion limits))并关闭程序。
我知道使用try和except来处理错误,但我不确定是否可以用它来处理最大递归深度错误。

请注意,您通常可以使用队列数据结构将任何递归算法实现为非递归算法。这是绕过递归限制的一种方法。 - jme
谢谢您提供的JME信息。我需要在这个任务中使用递归(这是一个课堂问题)。 - JohnKraz
@jme 你有没有任何关于如何在不知道结构体大小的情况下执行这个操作的例子(这通常是大多数人使用递归的原因)?例如,在网络链接中爬行,或通过 API 递归获取所有数据。 - Joe Flack
1个回答

10

最大递归深度错误只是另一个异常;你可以捕获RecursionError异常(Python 3.5或更高版本):

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

我已经将运行时异常附带的错误消息整合进来了;对于递归错误,错误消息为maximum recursion depth exceeded
如果您需要支持Python 3.5之前的版本,可以捕获基类RuntimeError。如果您担心捕获到的运行时错误不是递归深度错误,您可以检查.args[0]值。
try:
    solveMaze(maze)
except RuntimeError as err:
    if err.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(err.args[0]))

选项的演示:
>>> def infinity(): return infinity()
... 
>>> try:
...     infinity()
... except RecursionError as err:
...     print('Oopsie: {}'.format(err.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 err:
...     print('Oopsie: {}'.format(err.args[0]))
... 
Oopsie: dictionary changed size during iteration
>>> try:
...     infinity()
... except RuntimeError as err:
...     if err.args[0] != 'maximum recursion depth exceeded':
...         raise
...     print('Oopsie: {}'.format(err.args[0]))
... 
Oopsie: maximum recursion depth exceeded
>>> try:
...     alter_dict_size()
... except RuntimeError as err:
...     if err.args[0] != 'maximum recursion depth exceeded':
...         raise
...     print('Oopsie: {}'.format(err.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异常,但测试结果的异常消息可以让您区分开来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接