Python Ausnahmebehandlung

Exception Handling

In der Informatik und Computerprogrammierung ist die Ausnahmebehandlung der Prozess der Reaktion auf das Auftreten von Ausnahmen – anomalen oder außergewöhnlichen Bedingungen, die eine spezielle Verarbeitung erfordern.

Python verfügt über viele eingebaute Ausnahmen, die ausgelöst werden, wenn ein Programm auf einen Fehler stößt, und die meisten externen Bibliotheken, wie die beliebte Requests, enthalten eigene benutzerdefinierte Ausnahmen, mit denen wir umgehen müssen.

Grundlegende Ausnahmebehandlung

Man kann nicht durch Null teilen, das ist eine mathematische Wahrheit, und wenn man versucht, dies in Python zu tun, löst der Interpreter die eingebaute Ausnahme ZeroDivisionError aus:

def divide(dividend , divisor):
    print(dividend / divisor)

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

Angenommen, wir möchten nicht, dass unser Programm seine Ausführung stoppt oder dem Benutzer eine Ausgabe zeigt, die er nicht versteht. Wenn wir eine nützliche und klare Nachricht ausgeben möchten, müssen wir die Ausnahme mit den Schlüsselwörtern try und except behandeln:

# try-except: Ausnahmen elegant behandeln
def divide(dividend , divisor):
    try:  # Versuche, diesen Code auszuführen
        print(dividend / divisor)
    except ZeroDivisionError:  # Fange spezifischen Ausnahmetyp ab
        print('You can not divide by 0')

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
You can not divide by 0
Quiz

Melden Sie sich an, um dieses Quiz zu beantworten und Ihren Lernfortschritt zu verfolgen

Welche Schlüsselwörter werden in Python zur Ausnahmebehandlung verwendet?
A. try und except
B. catch und handle
C. error und rescue
D. if und else

Behandlung mehrerer Ausnahmen mit einem Ausnahmeblock

Sie können auch mehrere Ausnahmen in einer einzigen Zeile wie folgt behandeln, ohne mehrere Ausnahmeblöcke erstellen zu müssen.

# Mehrere Ausnahmen in einem except-Block behandeln
def divide(dividend , divisor):
    try:
        if (dividend == 10):
          var = 'str' + 1  # Dies löst TypeError aus
        else:
          print(dividend / divisor)
    except (ZeroDivisionError, TypeError) as error:  # Mehrere Ausnahmetypen abfangen
        print(error)  # Die Fehlermeldung ausgeben

divide(dividend=20, divisor=5)
4
divide(dividend=10, divisor=5)
can only concatenate str (not "int") to str
divide(dividend=10, divisor=0)
division by zero
Quiz

Melden Sie sich an, um dieses Quiz zu beantworten und Ihren Lernfortschritt zu verfolgen

Können Sie mehrere Ausnahmetypen in einem einzigen except-Block behandeln?
A. Nein, Sie müssen für jeden Ausnahmetyp separate except-Blöcke verwenden
B. Ja, indem Sie sie in ein Tupel wie except (Exception1, Exception2) setzen
C. Ja, aber nur, wenn sie verwandt sind
D. Nein, Python unterstützt dies nicht

Finally-Code in der Ausnahmebehandlung

Der Code im finally-Abschnitt wird immer ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wurde oder nicht:

# finally-Block: wird immer ausgeführt, unabhängig von Ausnahmen
def divide(dividend , divisor):
    try:
        print(dividend / divisor)
    except ZeroDivisionError:
        print('You can not divide by 0')
    finally:  # Wird immer ausgeführt, auch wenn eine Ausnahme auftritt
        print('Execution finished')

divide(dividend=10, divisor=5)
2.0
Execution finished
divide(dividend=10, divisor=0)
You can not divide by 0
Execution finished
Quiz

Melden Sie sich an, um dieses Quiz zu beantworten und Ihren Lernfortschritt zu verfolgen

Wann wird der finally-Block ausgeführt?
A. Nur wenn eine Ausnahme auftritt
B. Nur wenn keine Ausnahme auftritt
C. Immer, unabhängig davon, ob eine Ausnahme aufgetreten ist oder nicht
D. Niemals

Benutzerdefinierte Ausnahmen

Benutzerdefinierte Ausnahmen werden initialisiert, indem eine class erstellt wird, die von der Basisklasse Exception von Python erbt, und mit dem Schlüsselwort raise ausgelöst werden:

# Benutzerdefinierte Ausnahme: Erstellung durch Vererbung von der Exception-Klasse
class MyCustomException(Exception):
    pass

raise MyCustomException  # Löst die benutzerdefinierte Ausnahme aus
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException

Um eine benutzerdefinierte Ausnahmemeldung zu deklarieren, können Sie diese als Parameter übergeben:

class MyCustomException(Exception):
    pass

raise MyCustomException('A custom message for my custom exception')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException: A custom message for my custom exception

Das Behandeln einer benutzerdefinierten Ausnahme ist dasselbe wie bei jeder anderen:

try:
    raise MyCustomException('A custom message for my custom exception')
except MyCustomException:
    print('My custom exception was raised')
My custom exception was raised
Quiz

Melden Sie sich an, um dieses Quiz zu beantworten und Ihren Lernfortschritt zu verfolgen

Wie erstellt man eine benutzerdefinierte Ausnahme in Python?
A. Erstellen Sie eine Klasse, die von der Exception-Klasse erbt
B. Verwenden Sie den Decorator @exception
C. Rufen Sie Exception.create() auf
D. Importieren Sie sie aus einem speziellen Modul