【发布时间】:2022-10-15 02:35:26
【问题描述】:
首先我尝试了这个
def x():
try:
1/0 # just an division error to get an exception
except:
x()
这段代码在 3.10 中表现正常,我得到了RecursionError: maximum recursion depth exceeded,正如我所料,但 3.8 进入堆栈溢出并且没有正确处理递归错误。但我确实记得在旧版本的 Python 中也有 RecursionError,所以我尝试了
def x(): x()
这在两个版本的 Python 中都返回了RecursionError。
就好像(在第一个 sn-p 中)递归错误永远不会在 except 中抛出,而是在调用的函数中抛出,然后在调用但由 try-except 处理的函数的第一条指令处抛出错误。
然后我尝试了别的东西:
def x():
try:
x()
except:
x()
这在某种程度上更奇怪,堆栈溢出低于 3.10 但它卡在 3.10 的循环中
你能解释一下这种行为吗?
更新
@MisterMiyagi 发现了一个更奇怪的行为,在 <=python3.9 的 except 中添加语句不会导致 stackoverflow
def x():
try:
1/0
except:
print("")
x()
【问题讨论】:
-
在最后一种情况下,它会在处理错误时弹出顶部堆栈帧,以便为另一个递归提供空间。因此它将永远在最后 2 个递归级别之间循环。
-
是的,但这需要很长时间,特别是 2 ** sys.getrecursionlimit()。
-
Specifically, there will be a total of 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 function calls with the default recursion limit of 1000.
-
尝试将递归限制设置得更低(类似于 5),然后将一些打印语句添加到
x看看会发生什么 -
@MisterMiyagi 与 sys.setrecursionlimit(10) 的结果相同
标签: python recursion stack-overflow try-except pythoninterpreter