Ich habe eine try
/finally
Klausel in meinem Skript. Ist es möglich, die genaue Fehlermeldung innerhalb der finally
Klausel zu erhalten?Kann ich die Ausnahme von dem finally-Block in Python bekommen?
Antwort
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
Sie wollen das in der Klausel except tun, nicht die endgültige.
Siehe: http://www.doughellmann.com/articles/Python-Exception-Handling/
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
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.
Dies gilt nur für python2. – coldfix
@coldfix Meintest du, dass das nur für python3 gilt? –
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
einfach eine leere Variable für mögliche Ausnahme vor try
except
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
Dank. sys.exc_info (in einer except-Klausel) ist, was ich brauche – Goutham
Ab Python 3.?, können Sie auf 'sys.exc_info' aus' finally: 'Block zugreifen. – Kentzo
@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