1151 Stimmen

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

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

6 Stimmen

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 merken. Es ist eine gute Praxis, bestimmte Ausnahmen abzufangen.

38 Stimmen

Um genauer zu sein, ist das Abfangen aller möglichen Ausnahmen nur dann ein Problem, wenn sie unbemerkt abgefangen werden. Es ist schwer vorstellbar, wo dieser Ansatz sonst noch angebracht ist, außer wenn die abgefangenen Fehlermeldungen nach sys.stderr und möglicherweise protokolliert. Das ist eine absolut gültige und übliche Ausnahme.

1 Stimmen

Haben Sie es versucht: try: whatever() except Exception as e: exp_capture() ?

43voto

grepit Punkte 18534

Es gibt mehrere Möglichkeiten, dies zu tun, insbesondere mit Python 3.0 und höher

Ansatz 1

Dies ist ein einfacher Ansatz, aber nicht empfehlenswert, da Sie nicht genau wissen, welche Codezeile die Ausnahme tatsächlich auslöst:

def bad_method():
    try:
        sqrt = 0**-1
    except Exception as e:
        print(e)

bad_method()

Ansatz 2

Dieser Ansatz wird empfohlen, weil er mehr Details über jede Ausnahme liefert. Sie umfasst:

  • Zeilennummer für Ihren Code
  • Name der Datei
  • Der eigentliche Fehler in ausführlicherer Form

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()

0 Stimmen

Ich lasse meine Aufträge über einen HPC-Manager laufen. Ich möchte erfassen, wann der Manager (slurm, qsub, condor) einen Exit durchführt (um mich selbst mit meiner benutzerdefinierten E-Mail darüber zu informieren). Wird except: Haben Sie das verstanden? Aber es gibt mir keine Handhabe für e allerdings :(

0 Stimmen

Ist es möglich, zu verketten traceback.print_exc() ?

26voto

Danilo Punkte 963

Ich habe gerade herausgefunden, diesen kleinen Trick für die Prüfung, wenn Ausnahmen Namen in Python 2.7 . Manchmal habe ich bestimmte Ausnahmen in den Code behandelt, so dass ich einen Test benötigt, um zu sehen, wenn dieser Name innerhalb einer Liste von behandelten Ausnahmen ist.

try:
    raise IndexError #as test error
except Exception as e:
    excepName = type(e).__name__ # returns the name of the exception

0 Stimmen

Ich lasse meine Aufträge über einen HPC-Manager laufen. Ich möchte erfassen, wann der Manager (slurm, qsub, condor) einen Exit durchführt (um mich selbst mit meiner benutzerdefinierten E-Mail darüber zu informieren). Wird except: Haben Sie das verstanden? Aber es gibt mir keine Handhabe für e allerdings :(

0 Stimmen

Um ganz ehrlich zu sein, ich bin nicht vertraut mit HPC... Wenn es mit/für Python integriert ist, sollte es entsprechende Ausnahmen implementiert haben. Wenn nicht, können Sie versuchen, 3. Teil-Bibliothek, die es hat (keine Ahnung, welche) oder machen einen Task-Listener, die für Flagge von HPC gesetzt suchen würde. Wenn das alles fehlschlägt, kann man versuchen, selbst etwas zu programmieren, die Klasse 'exception' ist vererbbar und man kann in Prozesse/Treiber eintauchen. Ansonsten 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. Prost :)

25voto

Tamil Selvan Punkte 1284

Ich füge die Bonus-Methode hinzu, die die Ausnahme mit vollständigem Traceback abfangen kann, was Ihnen helfen kann, den Fehler besser zu verstehen.

Python 3

import traceback

try:
    # your code goes here
except Exception as e:
    print(e)
    traceback.print_exc()

1 Stimmen

Das ist sie.

11voto

Yuval Adam Punkte 155168
try:
    whatever()
except:
    # this will catch any exception or error

Es ist erwähnenswert, dass dies keine korrekte Python-Codierung ist. Dadurch werden auch viele Fehler abgefangen, die Sie vielleicht nicht abfangen wollen.

1 Stimmen

Verwenden Sie einfach except don't cach all exceptions, wie in einigen anderen Antworten erwähnt. Sie müssen BaseException für diesen Zweck verwenden, aber wie Sie sagten, sollte niemand alle Ausnahmen wie diese fangen. Ich denke, es ist ok für den Anfang, wenn das Ziel ist, mehr granulare Ausnahme während der Entwicklung hinzuzufügen, aber ich glaube nicht, dass es sein wird...

8voto

Hossein Kalbasi Punkte 1323

Zunächst einmal gibt es Ausnahmen, von denen Sie wollen, dass sie Ihren Code kaputt machen (denn wenn dieser Fehler auftritt, funktioniert Ihr Code sowieso nicht!), und Ausnahmen, die Sie still und leise erfassen wollen. Versuchen Sie, diese zu unterscheiden. Sie wollen vielleicht nicht alle Ausnahmen erfassen, die es gibt!

Zweitens: Anstatt alles zu erfassen, könnten Sie sich die Zeit nehmen und die Protokolle Ihres Prozesses durchgehen. Nehmen wir an, Sie erhalten eine andere/fremde Ausnahme, z. B. von einem Cloud-Dienstanbieter wie GCP. In den Protokollen könnten Sie die Ausnahme finden, die Sie erhalten. Dann könnten Sie etwas wie folgt tun:

from google.api_core.exceptions import ServiceUnavailable, RetryError

for i in range(10):
   try:
      print("do something")

   except ValueError:
      print("I know this might happen for now at times! skipping this and continuing with my loop"

   except ServiceUnavailable:
      print("our connection to a service (e.g. logging) of gcp has failed")
      print("initializing the cloud logger again and try continuing ...") 

   except RetryError:
      print("gcp connection retry failed. breaking the loop. try again later!)
      break

Für den Rest (Fehler, die passieren könnten oder auch nicht), lasse ich Raum für meinen Code zum Absturz, wenn ich eine unerwartete Ausnahme erhalten! Auf diese Weise kann ich verstehen, was vor sich geht, und meinen Code durch die Erfassung von Randfällen verbessern.

Wenn Sie möchten, dass das Programm aus irgendeinem Grund nie abstürzt, z. B. wenn es sich um einen Code handelt, der in eine entfernte Hardware eingebettet ist, auf die Sie nicht ohne weiteres zugreifen können, können Sie am Ende einen generischen Ausnahmefänger hinzufügen:

except Exception as e:
   print(f"something went wrong! - {e}")

Sie können auch einen Blick auf die Ausnahmehierarchie von Python 3 werfen ici . Der Unterschied zwischen Exception y BaseException ist das, Exception wird nicht fangen SystemExit , KeyboardInterrupt , oder GeneratorExit

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X