Wie kann ich eine schreiben try
/except
Block, der alle Ausnahmen abfängt?
Wie kann ich einen `try`/`except`-Block schreiben, der alle Ausnahmen abfängt?
Benutzer469652
Duncan
Abgesehen von einem nackten except:
-Klausel (die Sie, wie andere gesagt haben, nicht verwenden sollten), können Sie einfach abfangen Exception
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
Normalerweise würden Sie dies nur auf der äußersten Ebene Ihres Codes tun, wenn Sie beispielsweise vor dem Beenden alle ansonsten nicht abgefangenen Ausnahmen behandeln möchten.
Der Vorteil von except Exception
über dem nackten except
ist, dass es ein paar Ausnahmen gibt, die es am offensichtlichsten nicht abfängt KeyboardInterrupt
und SystemExit
: Wenn Sie diese gefangen und geschluckt haben, könnten Sie es jedem schwer machen, Ihr Skript zu beenden.
-
Ich hatte das Gleiche im Kopf, aber das ist ein Nachteil. Angenommen, es gibt zwei Fehler, wenn einmal abgefangen wird, und wenn Sie nur drucken, werden Sie den Try-Block verlassen und den zweiten Fehler nie erfahren. .
– Benutzer1176501
12. Januar 2013 um 8:01 Uhr
-
Für alle, die sich fragen, völlig entgegen meiner Erwartung wird dies immer noch Nicht-Ausnahme-Unterklassen von Dingen wie ints abfangen, zumindest in Python 2.x.
– Josef Garwin
1. Oktober 2014 um 22:17 Uhr
-
@JosephGarvin, das ist falsch, dh dies wird keine “Nicht-Ausnahmen” abfangen, die keine Unterklasse haben
Exception
. Beachten Sie, dass es unmöglich ist, ein zu erhöhenint
als Ausnahme, und der Versuch, dies zu tun, wirft aTypeError
Ausnahme, die von der Einschließung abgefangen würdeexcept Exception
Klausel in einem solchen Fall. Andererseits kann eine Klasse im alten Stil ausgelöst werden und gilt als “keine Ausnahme”, die keine Unterklasse bildetException
– Dies Wille von einem nackten erwischt werdenexcept
Klausel aber nicht durch eineexcept Exception
Klausel.– Yoel
14. November 2016 um 14:14 Uhr
-
@JosephGarvin überprüfen Sie diesen Blogeintrag: chris-lamb.co.uk/posts/no-one-expects-string-literal-exception Ich bin mit @Yoel in diesem Fall, Ihre Tests haben das nur maskiert
TypeError
– Duncan
14. November 2016 um 15:12 Uhr
-
@CharlieParker Es ist nichts falsch daran, sie zu fangen, wenn Sie das wollen, aber meistens nicht. Berufung
sys.exit()
bedeutet normalerweise, dass Sie erwarten, dass die App beendet wird, aber wenn Sie SystemExit abfangen, wird dies nicht der Fall sein. Wenn Sie in einem laufenden Skript Strg-C (Strg-Pause unter Windows) drücken, erwarten Sie gleichermaßen, dass das Programm stoppt, den Fehler nicht abfängt und fortfährt. Aber Sie können eines oder beide davon abfangen, wenn Sie eine Bereinigung durchführen möchten, bevor Sie existieren.– Duncan
4. Mai 2020 um 9:13 Uhr
Tim Pietzcker
Sie können, aber Sie sollten wahrscheinlich nicht:
try:
do_something()
except:
print("Caught it!")
Dies fängt jedoch auch Ausnahmen wie z KeyboardInterrupt
und das willst du normalerweise nicht, oder? Es sei denn, Sie lösen die Ausnahme sofort erneut aus – siehe folgendes Beispiel aus den Dokumenten:
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print("I/O error({0}): {1}".format(errno, strerror))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
-
Mögliche Problemumgehung: effbot.org/zone/stupid-exceptions-keyboardinterrupt.htm
– Mikel
14. Februar 2011 um 9:52 Uhr
-
Sie sollten wirklich auf stderr drucken.
– nyuszika7h
14. Januar 2015 um 20:34 Uhr
-
Ich stimme der Aussage “sollte nicht” sehr, sehr stark zu. Sie sollten es sparsam tun. Es gibt Zeiten, in denen Sie es mit Bibliotheken von Drittanbietern zu tun haben (manchmal dynamisch geladen !!), die mit Ausnahmen völlig verrückt geworden sind, und es kann eine sehr schmerzhafte Aufgabe sein, sie alle aufzuspüren, und wenn Sie nur eine übersehen, haben Sie ein sehr sehr großer schmerzhafter Fehler in Ihrem System. Abgesehen davon ist es gut, so viele wie möglich aufzuspüren und sie angemessen zu handhaben und dann einen Ersatzfang für alle zu haben, die Sie vermissen.
– Feuer
19. Oktober 2015 um 8:04 Uhr
-
Was ich auch seltsam finde, ist, dass es in einer Duck-Typing-Sprache, in der Sie keine Instanzvariablen deklarieren, plötzlich sehr darauf bedacht ist, nicht alle Ihre Ausnahmen einzugeben. Hmm!
– Feuer
19. Oktober 2015 um 8:06 Uhr
-
Fehlt noch die
except Exception:
.– Pedro Gordo
6. Februar 2019 um 19:34 Uhr
gitaarik
Um alle möglichen Ausnahmen abzufangen, catch BaseException
. Es steht ganz oben in der Ausnahmehierarchie:
Python3:
https://docs.python.org/3.9/library/exceptions.html#exception-hierarchy
Python 2.7:
https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
Aber wie andere Leute bereits erwähnt haben, benötigen Sie dies normalerweise nicht, nur für bestimmte Fälle.
-
Ist es so ungewöhnlich, den Fortschritt eines lang andauernden Jobs nach dem Drücken von Strg-C zu speichern?
– BallpointBen
28. August 2018 um 15:56 Uhr
-
Ich lasse meine Jobs von einem HPC-Manager laufen. Ich möchte erfassen, wann der (slurm, qsub, condor) Manager einen Exit macht (um mir mit meiner benutzerdefinierten E-Mail eine E-Mail darüber zu senden). Werden
except:
Fang das? Aber es gibt mir keinen Griff füre
obwohl 🙁– Charly Parker
29. September 2020 um 15:23 Uhr
-
In Python, all exceptions must be instances of a class that derives from BaseException
aber wenn Sie es für einen allgemeinen Fall weglassen können – lassen Sie es weg, das Problem ist, dass Wein darüber stolpert.– jave.web
3. November 2020 um 16:23 Uhr
-
@BallpointBen Dafür sind Signalhandler da. Es ist der Standard-Signalhandler für
SIGINT
das erhebtKeyboardInterrupt
an erster Stelle. Sicher, Sie können fangenKeyboardInterrupt
, aber es ist nur eines von vielen Signalen, die Ihr Programm vorzeitig beenden könnten. Diese erzeugen keine Art von Ausnahme, also können Sie sie genauso gut alle einheitlich behandeln.– chepner
23. Juli 2021 um 20:18 Uhr
-
ACHTUNG: verwenden
BaseException
so etwas will man selten. Wollen Sie ernsthaft Tastaturunterbrechungen und sys.exit abfangen? Wahrscheinlich nicht! Alle benutzerdefinierten Ausnahmen sollten erben vonException
. Werfen Sie einen Blick auf die Ausnahmeklassenhierarchie. dotnettutorials.net/wp-content/uploads/2020/07/…– Johann Henckel
28. Februar um 15:45 Uhr
vwvolodya
Sie können dies tun, um allgemeine Ausnahmen zu behandeln
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
Josua Burns
Sehr einfaches Beispiel, ähnlich dem hier gefundenen:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Wenn Sie versuchen, ALLE Ausnahmen abzufangen, setzen Sie Ihren gesamten Code in die Anweisung „try:“ anstelle von „print „Eine Aktion ausführen, die eine Ausnahme auslösen kann.““.
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
Im obigen Beispiel sehen Sie die Ausgabe in dieser Reihenfolge:
1) Ausführen einer Aktion, die eine Ausnahme auslösen kann.
2) Final wird direkt nach der Ausführung der try-Anweisung aufgerufen, unabhängig davon, ob eine Ausnahme ausgelöst wird oder nicht.
3) “Eine Ausnahme wurde ausgelöst!” oder “Alles sieht toll aus!” abhängig davon, ob eine Ausnahme ausgelöst wurde.
Hoffe das hilft!
-
Ich lasse meine Jobs von einem HPC-Manager laufen. Ich möchte erfassen, wann der (slurm, qsub, condor) Manager einen Exit macht (um mir mit meiner benutzerdefinierten E-Mail eine E-Mail darüber zu senden). Werden
except:
Fang das? Aber es gibt mir keinen Griff füre
obwohl 🙁– Charly Parker
29. September 2020 um 15:23 Uhr
-
außer Ausnahme, error:^SyntaxError: ungültige Syntax
– Toni
11. März 2021 um 16:51 Uhr
-
@Tony Versuch:
except Exception as error:
— Wenn Sie Python3 ausführen.– Josua Burns
3. August 2021 um 18:53 Uhr
Grusel
Es gibt mehrere Möglichkeiten, dies zu tun, insbesondere mit Python 3.0 und höher
Ansatz 1
Dies ist ein einfacher Ansatz, der jedoch nicht empfohlen wird, da Sie nicht genau wissen würden, welche Codezeile tatsächlich die Ausnahme auslöst:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
Ansatz 2
Dieser Ansatz wird empfohlen, da er mehr Details zu jeder Ausnahme bereitstellt. Es enthält:
- Zeilennummer für Ihren Code
- Dateiname
- Der eigentliche Fehler in ausführlicherer Weise
Der einzige Nachteil ist, dass Tracback importiert werden muss.
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
-
Ich lasse meine Jobs von einem HPC-Manager laufen. Ich möchte erfassen, wann der (slurm, qsub, condor) Manager einen Exit macht (um mir mit meiner benutzerdefinierten E-Mail eine E-Mail darüber zu senden). Werden
except:
Fang das? Aber es gibt mir keinen Griff füre
obwohl 🙁– Charly Parker
29. September 2020 um 15:23 Uhr
-
außer Ausnahme, error:^SyntaxError: ungültige Syntax
– Toni
11. März 2021 um 16:51 Uhr
-
@Tony Versuch:
except Exception as error:
— Wenn Sie Python3 ausführen.– Josua Burns
3. August 2021 um 18:53 Uhr
Ich habe gerade diesen kleinen Trick zum Testen von Ausnahmenamen in Python 2.7 herausgefunden. Manchmal habe ich bestimmte Ausnahmen im Code behandelt, also brauchte ich einen Test, um zu sehen, ob dieser Name in einer Liste behandelter Ausnahmen enthalten ist.
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__name__ # returns the name of the exception
-
Ich lasse meine Jobs von einem HPC-Manager laufen. Ich möchte erfassen, wann der (slurm, qsub, condor) Manager einen Exit macht (um mir mit meiner benutzerdefinierten E-Mail eine E-Mail darüber zu senden). Werden
except:
Fang das? Aber es gibt mir keinen Griff füre
obwohl 🙁– Charly Parker
29. September 2020 um 15:23 Uhr
-
Um ganz ehrlich zu sein, kenne ich mich mit HPC nicht aus … Wenn es mit / für Python integriert ist, sollten entsprechende Ausnahmen implementiert sein. Wenn nicht, können Sie die 3rd-Part-Bibliothek ausprobieren, die sie enthält (weiß nicht welche) oder einen Task-Listener erstellen, der nach dem von HPC gesetzten Flag sucht. Wenn das alles fehlschlägt, können Sie versuchen, einige selbst zu codieren, die Klasse „Ausnahme“ ist vererbbar und taucht in Prozesse/Treiber ein. Abgesehen davon würde ich aufgrund des Mangels an weiteren Informationen und der No-Opinions-Politik von SO vorschlagen, eine neue Frage mit HPC im Titel und in den Tags zu stellen – falls noch nicht gestellt. Jubeln 🙂
– Danilo
30. September 2020 um 1:55 Uhr
In den meisten Fällen machen Sie wahrscheinlich etwas falsch, wenn Sie versuchen, eine Ausnahme abzufangen. Ich meine, Sie können einfach etwas in Ihrem Code falsch schreiben und Sie werden es nicht einmal wissen. Es empfiehlt sich, bestimmte Ausnahmen abzufangen.
– vwvolodya
4. September 2014 um 12:25 Uhr
Genauer gesagt, das Abfangen aller möglichen Ausnahmen ist nur dann ein Problem, wenn sie stillschweigend abgefangen werden. Es ist schwer vorstellbar, wo dieser Ansatz sonst angebracht wäre, außer wo die abgefangenen Fehlermeldungen ausgegeben werden
sys.stderr
und ggf. protokolliert. Das ist eine vollkommen gültige und übliche Ausnahme.– Jewgeni Sergejew
7. Mai 2016 um 4:28 Uhr
Hast du versucht:
try: whatever() except Exception as e: exp_capture()
?– Charly Parker
2. Mai 2020 um 21:43 Uhr
Verwandte: Warum ist
except: pass
eine schlechte Programmierpraxis?– Dreier
25. Juli 2020 um 7:50 Uhr
Siehe auch Schlechte Idee, alle Ausnahmen in Python abzufangen
– Dreier
4. Juli 2021 um 15:48 Uhr