Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 处理超过最大递归深度_Python_Python 3.x_Recursion_Error Handling - Fatal编程技术网

Python 处理超过最大递归深度

Python 处理超过最大递归深度,python,python-3.x,recursion,error-handling,Python,Python 3.x,Recursion,Error Handling,我创建了一个程序,使用递归来解决简单的迷宫。在一个相当复杂的迷宫中,我得到一个最大递归深度错误。我在这个网站上搜索了这个错误,并阅读了一些帖子,所以我相信我对正在发生的事情有一个大致的了解 与我看到的其他线程不同,我没有试图增加递归限制。sys.setrecursionlimit()不是我想要的。我希望能够处理溢出,而不是崩溃,让程序打印一条消息(print(“很抱歉,由于递归限制,此迷宫解算器无法完成对迷宫的分析))并关闭 我知道使用try和except来处理错误,但我不确定是否可以合并它来处

我创建了一个程序,使用递归来解决简单的迷宫。在一个相当复杂的迷宫中,我得到一个最大递归深度错误。我在这个网站上搜索了这个错误,并阅读了一些帖子,所以我相信我对正在发生的事情有一个大致的了解

与我看到的其他线程不同,我没有试图增加递归限制。sys.setrecursionlimit()不是我想要的。我希望能够处理溢出,而不是崩溃,让程序打印一条消息(
print(“很抱歉,由于递归限制,此迷宫解算器无法完成对迷宫的分析)
)并关闭


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

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

我已经合并了附加到运行时异常的错误消息;对于
超过最大递归深度的递归错误

如果需要支持早于3.5的Python版本,则可以捕获基类。如果担心捕获非递归深度错误的运行时错误,则可以内省
.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
>>def infinity():返回infinity()
... 
>>>尝试:
…无穷大()
…除了递归错误作为re:
…打印('Oopsie:{}.format(re.args[0]))
... 
Oopsie:已超出最大递归深度
>>>def alter_dict_size():
…dct={'foo':'bar'}
…对于dct中的键:
…del dct['foo']
... 
>>>尝试:
…更改目录大小()
…运行时错误除外,原因如下:
…打印('Oopsie:{}.format(re.args[0]))
... 
Oopsie:字典在迭代过程中更改了大小
>>>尝试:
…无穷大()
…运行时错误除外,原因如下:
…如果re.args[0]!=“超过最大递归深度”:
…提高
…打印('Oopsie:{}.format(re.args[0]))
... 
Oopsie:已超出最大递归深度
>>>尝试:
…更改目录大小()
…运行时错误除外,原因如下:
…如果re.args[0]!=“超过最大递归深度”:
…提高
…打印('Oopsie:{}.format(re.args[0]))
... 
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
文件“”,第3行,大小不同
RuntimeError:字典在迭代期间更改了大小

更改字典大小也会引发
运行时错误
异常,但测试生成的异常消息可以让您区分。请注意,您通常可以使用队列数据结构将任何递归算法实现为非递归算法。这是绕过递归限制的一种方法。您好,谢谢您提供的信息信息JME。我被要求在这个赋值中使用递归(这是一个类问题),如果你想捕获递归错误,请捕获
RecursionError
!@SolomonUcko:感谢你指出这一点。这是一个新的异常,在Python 3.5中添加,于2015年9月首次发布。我已经将它添加到我的答案中。
>>> 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