从捕获的“RuntimeError”返回总是给出'None`python

时间:2015-09-16 03:44:08

标签: python python-3.x try-catch

所以我有一个有两种方法的课程:

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

1 个答案:

答案 0 :(得分:4)

因为方法ocamlyacc是递归的,但是当你以递归方式调用它时,你不会返回递归调用返回的结果。

所以在cycle()内,让我们再次调用self.cycle(),然后在尝试调用self.cycle()时发生RuntimeError,以便调用返回self.cycle()第一个10调用,但是这个(假设第一个self.cycle())调用不会将此结果返回给其调用者,因此第二个self.cycle()返回的结果将丢失,并且您将获得已退回self.cycle()

如果您返回None电话的结果,您应该得到正确的结果。示例 -

self.cycle()

请注意,我将递归限制设置为3,以便在3个递归级别之后发生递归深度超出错误。