所以我有一个有两种方法的课程:
class Test:
def cycle(self, n=float("inf"), block="x"):
try:
self.cycle(n-1, block)
except RuntimeError as e:
if str(e) == "maximum recursion depth exceeded":
print("... forever")
return 10
def f(self):
try:
raise Exception()
except:
return 10
return 20
x = Test()
print(x.cycle())
print(x.f())
并输出:
... forever
None
10
是什么给出的?为什么我可以从一个除外而不是另一个返回?我可以从第一个开始正常打印,除了它,但它总是返回None
答案 0 :(得分:4)
因为方法ocamlyacc
是递归的,但是当你以递归方式调用它时,你不会返回递归调用返回的结果。
所以在cycle()
内,让我们再次调用self.cycle()
,然后在尝试调用self.cycle()
时发生RuntimeError,以便调用返回self.cycle()
第一个10
调用,但是这个(假设第一个self.cycle()
)调用不会将此结果返回给其调用者,因此第二个self.cycle()
返回的结果将丢失,并且您将获得已退回self.cycle()
。
如果您返回None
电话的结果,您应该得到正确的结果。示例 -
self.cycle()
请注意,我将递归限制设置为3,以便在3个递归级别之后发生递归深度超出错误。