2017-05-10 3 views
-2

Ich habe einige Funktionen, die in einer Kette aufgerufen werden, auf der ich try/except-Blöcke einführen muss, um mit Ausnahmen umzugehen, die aus einer Bibliothek stammen, die ich verwende.Try/Blocks Ausnahmen in einer aufgerufenen Funktion

Ich versuche zu verstehen, wenn diese sicher ist, genauer gesagt, wenn wir immer erwarten, dass ein Try/außer Block nicht tiefen Versuch sieht/except Blöcke in dem Fluss der Ausführung:

def level_two_function(): 

    try: 
     return a[i] 
    except: 
     return "Exception at level 2" 

def level_one_function(): 

    try: 
     return level_two_function() 
    except: 
     return "Exception at level 1" 

level_one_function() # 'Exception at level 2' 

die versuchen/außer Block von in jedem Zustand sieht es jemals eine Ausnahme ausgelöst von level_two_function?

Wie ist das Verhalten im Vergleich zu der folgenden Situation?

def work(token, restrictions): 

    def loop(token): 
     if token.text in restrictions: 
      try: 
       return loop(token.nbor()) 
      except IndexError: 
       return token 
     else: 
      return token 

    try: 
     start = token.nbor() 
     return loop(start) 
    except IndexError: 
     # if it has no neighbor just return it 
     return token 
+0

Hier gibt es keine Rekursion; Nirgends nennt sich eine dieser Funktionen selbst. Nicht, dass die Antwort für einen rekursiven Aufruf jedoch anders wäre. –

+0

Ich weiß, ich habe nur ein Beispiel mit einer verschachtelten Ebene zur Verfügung gestellt. Also gilt die Rückgabe Ausnahme nur in einem rekursiven Aufruf? –

+1

Nein, es spielt keine Rolle, ob der Aufruf rekursiv ist oder nicht. –

Antwort

1

Ihre level_one_function() kann noch sehen Ausnahmen während level_two_function angehoben, wenn eine Ausnahme in der return "Exception at level 2" Linie angehoben wurde.

Diese Zeile kann eine Ausnahme auslösen, wenn der Arbeitsspeicher nicht mehr ausreicht oder ein Tastaturinterrupt gesendet wurde.

Alle Ausnahmen, die in dem try:..except-Block von level_two_function() ausgelöst werden, werden jedoch von diesem Block behandelt und die Aufrufliste wird nicht weitergeleitet.

+0

danke für die schnelle antwort. Ich werde es als akzeptiert markieren –

Verwandte Themen