Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Python

Python Exception Handling: Umfassender Leitfaden zur Fehlerbehandlung

Standardausnahmen in Python

Python bietet zwei wichtige Features zur Behandlung unerwarteter Fehler und für Debugging-Fähigkeiten:

Liste der Standardausnahmen

Nr.Ausnahme & Beschreibung
1Exception – Basisklasse für alle Ausnahmen.
2StopIteration – Wird ausgelöst, wenn next() eines Iterators auf kein Objekt verweist.
3SystemExit – Wird durch sys.exit() ausgelöst.
4StandardError – Basisklasse für alle eingebauten Ausnahmen außer StopIteration und SystemExit.
5ArithmeticError – Basisklasse für alle numerischen Berechnungsfehler.
6OverflowError – Berechnung überschreitet das Maximum für einen numerischen Typ.
7FloatingPointError – Gleitkomma-Berechnung fehlgeschlagen.
8ZeroDivisionError – Division oder Modulo durch Null bei allen numerischen Typen.
9AssertionError – Fehlschlagen der assert-Anweisung.
10AttributeError – Fehlschlagen von Attributreferenz oder -zuweisung.
11EOFError – Keine Eingabe von raw_input() oder input() und Dateiende erreicht.
12ImportError – import-Anweisung fehlgeschlagen.
13KeyboardInterrupt – Benutzer unterbricht Programm (meist Strg+C).
14LookupError – Basisklasse für Suchfehler.
15IndexError – Index in einer Sequenz nicht gefunden.
16KeyError – Schlüssel nicht im Dictionary gefunden.
17NameError – Bezeichner nicht im lokalen oder globalen Namensraum gefunden.
18UnboundLocalError – Zugriff auf lokale Variable in Funktion, der kein Wert zugewiesen wurde.
19EnvironmentError – Basisklasse für Ausnahmen außerhalb der Python-Umgebung.
20IOError – Eingabe-/Ausgabeoperation fehlgeschlagen (z. B. print oder open() bei nicht existierender Datei).
21OSError – Betriebssystembedingte Fehler.
22SyntaxError – Fehler in der Python-Syntax.
23IndentationError – Einrückung nicht korrekt angegeben.
24SystemError – Internes Interpreterproblem, Interpreter beendet sich nicht.
25SystemExit – Interpreter wird durch sys.exit() beendet. Unbehandelt führt zum Exit.
26TypeError – Operation/ Funktion ungültig für den Datentyp.
27ValueError – Eingebaute Funktion hat gültigen Typ, aber ungültige Werte.
28RuntimeError – Erzeugter Fehler fällt in keine Kategorie.
29NotImplementedError – Abstrakte Methode in erbender Klasse nicht implementiert.

Assertions in Python

Eine Assertion ist ein Plausibilitätstest, den Sie nach Abschluss der Tests aktivieren oder deaktivieren können.

Am einfachsten stellt man sich eine Assertion als raise-if-not-Anweisung vor: Ein Ausdruck wird geprüft, und wenn er False ergibt, wird eine Ausnahme ausgelöst.

Assertions werden durch die assert-Anweisung durchgeführt, ein Schlüsselwort, das in Version 1.5 eingeführt wurde.

Programmierer platzieren Assertions oft am Funktionsanfang zur Validierung der Eingabe und nach Funktionsaufrufen zur Validierung der Ausgabe.

Die assert-Anweisung

Syntax:

assert Expression[, Arguments]

Wenn der Ausdruck False ist, löst Python eine AssertionError-Ausnahme aus. Der optionale Arguments-Wert dient als Argument für die Ausnahme. AssertionError kann wie jede andere Ausnahme mit try-except abgefangen werden; andernfalls beendet sie das Programm mit einem Traceback.

Beispiel

Funktion zur Umrechnung von Kelvin in Fahrenheit. Da 0 Kelvin der absolute Nullpunkt ist, bricht die Funktion bei negativen Temperaturen ab:

#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
    assert (Temperature >= 0), "Colder than absolute zero!"
    return ((Temperature - 273) * 1.8) + 32

print(KelvinToFahrenheit(273))
print(int(KelvinToFahrenheit(505.78)))
print(KelvinToFahrenheit(-5))

Ausgabe:

32.0
451
Traceback (most recent call last):
  File "test.py", line 9, in 
    print(KelvinToFahrenheit(-5))
  File "test.py", line 4, in KelvinToFahrenheit
    assert (Temperature >= 0), "Colder than absolute zero!"
AssertionError: Colder than absolute zero!

Was ist eine Exception?

Eine Exception ist ein Ereignis, das während der Programmausführung auftritt und den normalen Ablauf der Anweisungen stört. Wenn ein Python-Skript auf eine Situation stößt, die es nicht bewältigen kann, löst es eine Exception aus. Eine Exception ist ein Python-Objekt, das einen Fehler repräsentiert.

Wird eine Exception ausgelöst, muss sie entweder sofort behandelt werden, andernfalls terminiert das Skript.

Eine Exception behandeln

Verdächtigen Sie Code, der eine Exception auslösen könnte, können Sie Ihr Programm schützen, indem Sie den Code in einen try:-Block setzen. Darauf folgt eine except:-Anweisung mit einem Block, der das Problem so elegant wie möglich behandelt.

Syntax

try:
    # Ihre Operationen hier
    ...
except ExceptionI:
    # Bei ExceptionI diesen Block ausführen
except ExceptionII:
    # Bei ExceptionII diesen Block ausführen
    ...
else:
    # Wenn keine Exception, diesen Block ausführen

Wichtige Punkte

Beispiel: Erfolgreiches Schreiben

#!/usr/bin/python
try:
    fh = open("testfile", "w")
    fh.write("This is my test file for exception handling!!")
except IOError:
    print("Error: can't find file or read data")
else:
    print("Written content in the file successfully")
    fh.close()

Ausgabe:

Written content in the file successfully

Beispiel: Fehlgeschlagenes Schreiben (keine Schreibberechtigung)

#!/usr/bin/python
try:
    fh = open("testfile", "r")
    fh.write("This is my test file for exception handling!!")
except IOError:
    print("Error: can't find file or read data")
else:
    print("Written content in the file successfully")

Ausgabe:

Error: can't find file or read data

except-Klausel ohne Exception-Typ

Sie können except ohne definierte Ausnahmen verwenden:

try:
    # Operationen
    ...
except:
    # Bei beliebiger Exception diesen Block ausführen
    ...
else:
    # Keine Exception -> diesen Block ausführen

Dies fängt alle Exceptions ab. Dies gilt jedoch als schlechte Praxis, da die Fehlerursache nicht identifiziert wird.

except-Klausel mit mehreren Exceptions

Mehrere Exceptions in einer except-Klausel behandeln:

try:
    # Operationen
    ...
except (Exception1[, Exception2[, ... ExceptionN]]):
    # Bei einer Exception aus der Liste diesen Block ausführen
    ...
else:
    # Keine Exception -> diesen Block ausführen

Der try-finally-Block

Ein finally:-Block zusammen mit try: stellt Code bereit, der immer ausgeführt wird, egal ob eine Exception auftrat oder nicht.

try:
    # Operationen
    ...
finally:
    # Wird immer ausgeführt
    ...

Ein else-Block kann nicht zusammen mit finally verwendet werden.

Beispiel

#!/usr/bin/python
try:
    fh = open("testfile", "w")
    fh.write("This is my test file for exception handling!!")
finally:
    print("Error: can't find file or read data")

Ohne Schreibberechtigung ergibt sich:

Error: can't find file or read data

Sauberer geschrieben mit verschachtelten try-finally:

#!/usr/bin/python
try:
    fh = open("testfile", "w")
    try:
        fh.write("This is my test file for exception handling!!")
    finally:
        print("Going to close the file")
        fh.close()
except IOError:
    print("Error: can't find file or read data")

Wird eine Exception im try-Block ausgelöst, geht die Ausführung sofort zum finally-Block. Nach Abarbeitung aller finally-Anweisungen wird die Exception erneut ausgelöst und in den except-Blöcken der nächsthöheren try-except-Ebene behandelt.

Argument einer Exception

Eine Exception kann ein Argument haben – ein Wert mit zusätzlichen Informationen zum Problem. Der Inhalt variiert je Exception. Sie fangen das Argument ab, indem Sie eine Variable in der except-Klausel angeben:

try:
    # Operationen
    ...
except ExceptionType, Argument:
    # Wert von Argument ausgeben...

Bei einer einzelnen Exception folgt die Variable dem Exception-Namen. Bei mehreren Exceptions folgt die Variable dem Tuple der Exceptions. Die Variable erhält den Exception-Wert (meist Ursache), als einzelnen Wert oder Tuple (Fehlerstring, Fehlernummer, Fehlerposition).

Beispiel: Einzelne Exception

#!/usr/bin/python
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print("The argument does not contain numbers\n", Argument)

temp_convert("xyz")

Ausgabe:

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

Exceptions auslösen (raise)

Sie können Exceptions mit der raise-Anweisung auslösen. Allgemeine Syntax:

raise [Exception [, args [, traceback]]]

Exception ist der Exception-Typ (z. B. NameError), argument der Wert für das Exception-Argument (optional, Standard None), traceback optional (selten verwendet).

Beispiel

def functionName(level):
    if level < 1:
        raise "Invalid level!", level
    # Code darunter wird nicht ausgeführt, wenn Exception geworfen wird

Hinweis: Um eine Exception abzufangen, muss die except-Klausel dieselbe Exception referenzieren (Klassenobjekt oder String). Für das obige Beispiel:

try:
    # Business Logic
except "Invalid level!":
    # Exception handling
else:
    # Rest des Codes

Benutzerdefinierte Exceptions

Python erlaubt das Erstellen eigener Exceptions durch Ableitung von den Standard-Built-in-Exceptions.

Beispiel basierend auf RuntimeError. Eine Klasse wird erstellt, die von RuntimeError erbt – nützlich für spezifischere Informationen beim Abfangen.

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

Nach Definition der Klasse können Sie die Exception wie folgt auslösen:

try:
    raise Networkerror("Bad hostname")
except Networkerror, e:
    print(e.args)

Python

  1. Python-Datentypen meistern: Praxisleitfaden
  2. Python-Operatoren meistern: Umfassender Leitfaden
  3. Python pass-Statement meistern: Praxisleitfaden
  4. Python-Funktionsargumente meistern: Positional, Keyword & Default-Parameter
  5. Python-Dictionaries meistern: Erstellung, Manipulation und fortgeschrittene Techniken
  6. Python-Fehler & eingebaute Exceptions meistern
  7. Python Exception Handling meistern: try, except, else und finally erklärt
  8. Python benutzerdefinierte Exceptions: Ein praktischer Leitfaden
  9. Python Iteratoren meistern: Funktionsweise und Erstellung eigener Iteratoren
  10. Python Closures erklärt: Wie verschachtelte Funktionen Variablen erfassen