2009-10-23 1 views

Antwort

58

Nein, bei finally Zeit sys.exc_info all-None ist, ob es eine Ausnahme wurde oder nicht. Verwendung:

try: 
    whatever 
except: 
    here sys.exc_info is valid 
    to re-raise the exception, use a bare `raise` 
else: 
    here you know there was no exception 
finally: 
    and here you can do exception-independent finalization 
+0

Dank. sys.exc_info (in einer except-Klausel) ist, was ich brauche – Goutham

+0

Ab Python 3.?, können Sie auf 'sys.exc_info' aus' finally: 'Block zugreifen. – Kentzo

+0

@Kentzo Ich habe das gerade in Python 3.6 ausprobiert. 'sys.exc_info()' gibt ''(None, None, None)' im finally-Block zurück, wenn Sie eine Ausnahme ausgelöst haben. – Jonathan

10

Der finally Block ausgeführt wird, unabhängig davon, ob eine Ausnahme ausgelöst wurde oder nicht, so wie Josh weist darauf hin, Sie sehr wahrscheinlich nicht wollen, es dort zu handhaben.

Wenn Sie wirklich den Wert einer ausgelösten Ausnahme benötigen, sollten Sie die Ausnahme in einem except-Block abfangen und entweder entsprechend behandeln oder erneut erhöhen und dann diesen Wert im finally-Block verwenden. - mit der Erwartung, dass es nie gesetzt wurde, wenn während der Ausführung keine Ausnahme ausgelöst wurde.

import sys 

exception_name = exception_value = None 

try: 
    # do stuff 
except Exception, e: 
    exception_name, exception_value = sys.exc_info()[:2] 
    raise # or don't -- it's up to you 
finally: 
    # do something with exception_name and exception_value 
    # but remember that they might still be none 
3

Eigentlich sind andere Antworten etwas vage. Also, lass mich das klären. Sie können immer sys.exc_info() von finally block aufrufen. Die Ausgabe variiert jedoch je nachdem, ob die Ausnahme tatsächlich ausgelöst wurde.

So können Sie immer in Block schließlich wissen, ob Ausnahme ausgelöst wurde, wenn es erste Ebene Funktion ist. Sys.exc_info() verhält sich jedoch anders, wenn die Länge des Aufrufstapels 1 überschreitet, wie im folgenden Beispiel gezeigt. Weitere Informationen finden Sie unter How sys.exc_info() works?

import sys 

def f(i): 

    try: 
     if i == 1: 
      raise Exception 
    except Exception as e: 
     print "except -> " + str(sys.exc_info()) 
    finally: 
     print "finally -> " + str(sys.exc_info()) 

def f1(i): 
    if i == 0: 
     try: 
      raise Exception('abc') 
     except Exception as e: 
      pass 

    f(i) 

f1(0) 
f1(1) 

>>> 
finally -> (<type 'exceptions.Exception'>, Exception('abc',), <traceback object at 0x02A33940>) 
except -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>) 
finally -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>) 

Ich hoffe, es macht die Dinge etwas klarer.

+1

Dies gilt nur für python2. – coldfix

+0

@coldfix Meintest du, dass das nur für python3 gilt? –

+1

Nein, ich führe das Skript sowohl auf python2 als auch auf python3 aus. Auf python3 (nach Behebung kleinerer syntaktischer Probleme) ist die Ausgabe für 'f (1)' 'finally -> (None, None, None)', so dass Sie die Ausnahme im finally-Block nicht so einfach bekommen können. – coldfix

0

einfach eine leere Variable für mögliche Ausnahme vor tryexcept Block definieren:

import sys 

exception = None 

try: 
    result = 1/0 
except ZeroDivisionError as e: 
    exception = sys.exc_info() # or "e" 
finally: 
    if exception: 
     print(exception) 
    else: 
     print('Everything is fine') 

auf Python 3.6 Geprüft