2015-09-16 47 views
6

所以我有一個類有兩種方法吧:從抓 「RuntimeError」 返回總是給人`None`蟒蛇

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

哼,我只是試着把'return 10'從RuntimeError中移出來,就像e:'一樣。它正在工作。 –

回答

4

因爲方法cycle()是遞歸的,但是當您遞歸調用它時,不會返回遞歸調用返回的結果。

所以裏面self.cycle(),可以說你再打電話self.cycle(),然後在試圖調用self.cycle()的RuntimeError發生時,讓調用返回10回第一self.cycle()電話,但這個(可以說第一self.cycle())調用不做不會將此結果返回給其調用方,因此第二個self.cycle()返回的結果將丟失,並且返回None

如果您返回self.cycle()調用的結果,則應該得到正確的結果。示例 -

>>> import sys 
>>> sys.setrecursionlimit(3) 
>>> class Test: 
...  def cycle(self, n=float("inf"), block="x"): 
...   try: 
...    return self.cycle(n-1, block) 
...   except RuntimeError as e: 
...    if str(e) == "maximum recursion depth exceeded": 
...     print("... forever") 
...     return 10 
... 
>>> t = Test() 
>>> print(t.cycle()) 
... forever 
10 

請注意,我設置了遞歸限制到3,這樣的遞歸深度超過3個後水平遞歸的錯誤發生。

+0

啊,我多麼傻。這裏是我認爲python有一種特殊的複雜的方式來處理'RuntimeError',當它只是一個錯過'return'語句。謝謝 – River