Wie kann ich einen `try`/`except`-Block schreiben, der alle Ausnahmen abfängt?

Lesezeit: 9 Minuten

Benutzer-Avatar
Benutzer469652

Wie kann ich eine schreiben try/except Block, der alle Ausnahmen abfängt?

  • 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


Benutzer-Avatar
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öhen int als Ausnahme, und der Versuch, dies zu tun, wirft a TypeError Ausnahme, die von der Einschließung abgefangen würde except Exception Klausel in einem solchen Fall. Andererseits kann eine Klasse im alten Stil ausgelöst werden und gilt als “keine Ausnahme”, die keine Unterklasse bildet Exception – Dies Wille von einem nackten erwischt werden except Klausel aber nicht durch eine except 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

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

Benutzer-Avatar
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ür e obwohl 🙁

    – Charly Parker

    29. September 2020 um 15:23 Uhr

  • In Python, all exceptions must be instances of a class that derives from BaseExceptionaber 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 erhebt KeyboardInterrupt an erster Stelle. Sicher, Sie können fangen KeyboardInterrupt, 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 von Exception. Werfen Sie einen Blick auf die Ausnahmeklassenhierarchie. dotnettutorials.net/wp-content/uploads/2020/07/…

    – Johann Henckel

    28. Februar um 15:45 Uhr

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

Benutzer-Avatar
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ür e 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

Benutzer-Avatar
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ür e 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ür e 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

1145890cookie-checkWie kann ich einen `try`/`except`-Block schreiben, der alle Ausnahmen abfängt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy