2015-09-16 8 views
6

Così ho una classe con due metodi in esso:catturato "RuntimeError" dà sempre `python 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()) 

e uscite:

... forever 
None 
10 

cosa succede? Perché posso tornare da uno tranne e non dall'altro? Posso stampare normalmente dal primo ad eccezione, ma restituisce sempre None

+0

Hum, ho appena provato a mettere il 'return 10' fuori da' except RuntimeError as e: '. E sta funzionando. –

risposta

4

Poiché il metodo cycle() è ricorsivo, ma quando lo si richiama in modo ricorsivo non si restituisce il risultato restituito dalla chiamata ricorsiva.

Così all'interno self.cycle(), diciamo che si chiama self.cycle() di nuovo, e poi in che quando si cerca di chiamare self.cycle() si verifica l'RuntimeError, in modo che chiamata restituisce 10 di nuovo al primo self.cycle() chiamata, ma questo (diciamo prima self.cycle()) chiamata non non restituire questo risultato al chiamante, quindi il risultato restituito dal secondo self.cycle() viene perso e viene restituito None.

Se si restituisce il risultato della chiamata self.cycle(), è necessario ottenere il risultato corretto. Esempio -

>>> 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 

Si prega di notare, ho impostato il limite di ricorsione per 3 in modo che la profondità di ricorsione superato errore si verifica dopo 3 livelli di ricorsione.

+0

Ah, che sciocco da parte mia. Stavo pensando che Python avesse un modo speciale e complicato di gestire 'RuntimeError' quando era semplicemente un'istruzione' return' persa. Grazie – River

Problemi correlati