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
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()
?0 Stimmen
Verwandt: Warum ist
except: pass
eine schlechte Programmierpraxis?0 Stimmen
Siehe auch Schlechte Idee, alle Ausnahmen in Python abzufangen
0 Stimmen
Verwandt: stackoverflow.com/questions/4564559/
1 Stimmen
Fyi, schließlich Blöcke werden immer entschuldigt, egal was afaik.