Wie man prüft, ob eine Ausnahme in Python einen bestimmten Typ hat

PythonPythonBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie in Python prüfen können, ob eine Ausnahme (Exception) einen bestimmten Typ hat. Dies ist eine entscheidende Fähigkeit für eine effektive Fehlerbehandlung. Das Lab konzentriert sich darauf, die Hierarchie der Ausnahmen zu verstehen und diese Kenntnisse zur Identifizierung bestimmter Ausnahmetypen zu nutzen.

Das Lab führt Sie durch die Erkundung der Python-Ausnahmehierarchie, beginnend mit der Basisklasse BaseException und ihren Unterklassen wie Exception. Sie erstellen ein Python-Skript namens exception_hierarchy.py, um die Ausnahmehierarchie auszugeben. Dadurch können Sie die Beziehungen zwischen verschiedenen Ausnahmeklassen visualisieren. Dieses Verständnis wird dann in den folgenden Schritten angewendet, um Ausnahmetypen mit isinstance() und direkten Klassenvergleichen zu prüfen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/custom_exceptions("Custom Exceptions") subgraph Lab Skills python/catching_exceptions -.-> lab-559609{{"Wie man prüft, ob eine Ausnahme in Python einen bestimmten Typ hat"}} python/raising_exceptions -.-> lab-559609{{"Wie man prüft, ob eine Ausnahme in Python einen bestimmten Typ hat"}} python/custom_exceptions -.-> lab-559609{{"Wie man prüft, ob eine Ausnahme in Python einen bestimmten Typ hat"}} end

Die Ausnahmehierarchie verstehen

In diesem Schritt lernen Sie die Ausnahmehierarchie in Python kennen. Das Verständnis dieser Hierarchie ist für eine effektive Fehlerbehandlung von entscheidender Bedeutung. Ausnahmen in Python sind in einer baumartigen Struktur organisiert, wobei eine Basisklasse oben steht und spezifischere Ausnahmeklassen von ihr erben.

Die Basisklasse für alle Ausnahmen ist BaseException. Direkt von BaseException erben Exception, GeneratorExit, KeyboardInterrupt und SystemExit. Die Exception-Klasse ist die Oberklasse für die meisten eingebauten Ausnahmen, die auf Fehler hinweisen, die Ihr Programm möglicherweise begegnet.

Lassen Sie uns ein Python-Skript erstellen, um diese Hierarchie zu erkunden.

  1. Öffnen Sie Ihren VS Code-Editor.

  2. Erstellen Sie eine neue Datei namens exception_hierarchy.py im Verzeichnis ~/project.

    ~/project/exception_hierarchy.py
  3. Fügen Sie den folgenden Code zur Datei exception_hierarchy.py hinzu:

    def print_exception_hierarchy(exception_class, indent=0):
        """Prints the exception hierarchy starting from a given exception class."""
        print('  ' * indent + str(exception_class))
        for subclass in exception_class.__subclasses__():
            print_exception_hierarchy(subclass, indent + 1)
    
    print("Exception Hierarchy:")
    print_exception_hierarchy(Exception)

    Dieses Skript definiert eine rekursive Funktion print_exception_hierarchy, die die Ausnahmehierarchie ab der Exception-Klasse ausgibt.

  4. Führen Sie das Skript mit dem folgenden Befehl im Terminal aus:

    python exception_hierarchy.py

    Dadurch wird eine baumartige Struktur der Ausnahmehierarchie im Terminal ausgegeben.

    Beispielausgabe:

    Exception Hierarchy:
    <class 'Exception'>
      <class 'ArithmeticError'>
        <class 'FloatingPointError'>
        <class 'OverflowError'>
        <class 'ZeroDivisionError'>
          <class 'decimal.DivisionByZero'>
      <class 'AssertionError'>
      <class 'AttributeError'>
      <class 'BufferError'>
      <class 'EOFError'>
      <class 'ImportError'>
        <class 'ModuleNotFoundError'>
        <class 'ZipImportError'>
      <class 'LookupError'>
        <class 'IndexError'>
        <class 'KeyError'>
          <class 'tracemalloc.DomainKey'>
      <class 'MemoryError'>
      <class 'NameError'>
        <class 'UnboundLocalError'>
      <class 'OSError'>
        <class 'BlockingIOError'>
        <class 'ChildProcessError'>
        <class 'ConnectionError'>
          <class 'BrokenPipeError'>
          <class 'ConnectionAbortedError'>
          <class 'ConnectionRefusedError'>
          <class 'ConnectionResetError'>
        <class 'FileExistsError'>
        <class 'FileNotFoundError'>
        <class 'InterruptedError'>
          <class 'InterruptedSystemCall'>
        <class 'IsADirectoryError'>
        <class 'NotADirectoryError'>
        <class 'PermissionError'>
        <class 'ProcessLookupError'>
        <class 'TimeoutError'>
        <class 'UnsupportedOperation'>
        <class 'itertools.Incomplete'>
        <class 'signal.ItimerError'>
      <class 'ReferenceError'>
      <class 'RuntimeError'>
        <class 'NotImplementedError'>
          <class 'asyncio.exceptions.IncompleteReadError'>
          <class 'zlib.error'>
        <class '_frozen_importlib._DeadlockError'>
        <class 'RecursionError'>
      <class 'StopAsyncIteration'>
      <class 'StopIteration'>
      <class 'SyntaxError'>
        <class 'IndentationError'>
          <class 'TabError'>
      <class 'SystemError'>
      <class 'TypeError'>
      <class 'ValueError'>
        <class 'UnicodeError'>
          <class 'UnicodeDecodeError'>
          <class 'UnicodeEncodeError'>
          <class 'UnicodeTranslateError'>
      <class 'Warning'>
        <class 'BytesWarning'>
        <class 'DeprecationWarning'>
        <class 'EncodingWarning'>
        <class 'FutureWarning'>
        <class 'ImportWarning'>
        <class 'PendingDeprecationWarning'>
        <class 'ResourceWarning'>
        <class 'RuntimeWarning'>
        <class 'SyntaxWarning'>
        <class 'UnicodeWarning'>
        <class 'UserWarning'>

    Diese Ausgabe zeigt die Hierarchie der Ausnahmen, wobei Exception die Basisklasse ist und verschiedene Unterklassen spezifische Fehlerarten darstellen. Das Verständnis dieser Hierarchie hilft Ihnen, Ausnahmen auf der geeigneten Granularitätsebene abzufangen. Beispielsweise können Sie eine spezifische Ausnahme wie ZeroDivisionError oder eine allgemeinere Ausnahme wie ArithmeticError (die Elternklasse von ZeroDivisionError ist) abfangen.

Die Verwendung von isinstance() für Ausnahmen

In diesem Schritt lernen Sie, wie Sie die isinstance()-Funktion verwenden können, um zu prüfen, ob eine Ausnahme eine Instanz einer bestimmten Klasse oder einer Tupel von Klassen ist. Dies ist nützlich, um verschiedene Arten von Ausnahmen flexibel zu behandeln.

Die isinstance()-Funktion nimmt zwei Argumente: ein Objekt und eine classinfo. Sie gibt True zurück, wenn das Objekt eine Instanz der classinfo oder einer Unterklasse davon ist. Andernfalls gibt sie False zurück.

Lassen Sie uns ein Python-Skript erstellen, um die Verwendung von isinstance() mit Ausnahmen zu demonstrieren.

  1. Öffnen Sie Ihren VS Code-Editor.

  2. Erstellen Sie eine neue Datei namens isinstance_exception.py im Verzeichnis ~/project.

    ~/project/isinstance_exception.py
  3. Fügen Sie den folgenden Code zur Datei isinstance_exception.py hinzu:

    try:
        result = 10 / 0
    except Exception as e:
        if isinstance(e, ZeroDivisionError):
            print("Caught a ZeroDivisionError!")
        elif isinstance(e, ArithmeticError):
            print("Caught an ArithmeticError!")
        else:
            print("Caught some other exception!")
    
    print("Program continues...")

    In diesem Skript versuchen wir, 10 durch 0 zu teilen, was eine ZeroDivisionError auslösen wird. Anschließend fangen wir die Ausnahme ab und verwenden isinstance(), um zu prüfen, ob es sich um eine Instanz von ZeroDivisionError oder ArithmeticError handelt.

  4. Führen Sie das Skript mit dem folgenden Befehl im Terminal aus:

    python isinstance_exception.py

    Dadurch wird "Caught a ZeroDivisionError!" im Terminal ausgegeben.

    Beispielausgabe:

    Caught a ZeroDivisionError!
    Program continues...

    Die Ausgabe zeigt, dass die isinstance()-Funktion die Ausnahme korrekt als Instanz von ZeroDivisionError identifiziert hat. Da ZeroDivisionError eine Unterklasse von ArithmeticError ist, wird die erste if-Bedingung erfüllt, und die entsprechende Nachricht wird ausgegeben.

    Jetzt ändern wir das Skript, um eine allgemeinere Ausnahme abzufangen.

  5. Ändern Sie die Datei isinstance_exception.py wie folgt:

    try:
        result = int("abc")
    except Exception as e:
        if isinstance(e, ZeroDivisionError):
            print("Caught a ZeroDivisionError!")
        elif isinstance(e, ValueError):
            print("Caught a ValueError!")
        elif isinstance(e, ArithmeticError):
            print("Caught an ArithmeticError!")
        else:
            print("Caught some other exception!")
    
    print("Program continues...")

    In diesem geänderten Skript versuchen wir, die Zeichenkette "abc" in eine Ganzzahl umzuwandeln, was eine ValueError auslösen wird.

  6. Führen Sie das Skript erneut mit demselben Befehl aus:

    python isinstance_exception.py

    Dadurch wird "Caught a ValueError!" im Terminal ausgegeben.

    Beispielausgabe:

    Caught a ValueError!
    Program continues...

    Diese Ausgabe zeigt, dass isinstance() verwendet werden kann, um zwischen verschiedenen Arten von Ausnahmen zu unterscheiden und sie entsprechend zu behandeln.

Prüfung mit Ausnahmeklassen

In diesem Schritt lernen Sie, wie Sie direkt in Ihren except-Blöcken auf bestimmte Ausnahmeklassen prüfen können. Dies ist im Vergleich zur Verwendung von isinstance() eine direktere und oft klarere Methode zur Behandlung von Ausnahmen.

Wenn Sie except ExceptionType as e: verwenden, sagen Sie Python, nur Ausnahmen vom Typ ExceptionType oder einer Unterklasse davon abzufangen.

Lassen Sie uns ein Python-Skript erstellen, um dies zu demonstrieren.

  1. Öffnen Sie Ihren VS Code-Editor.

  2. Erstellen Sie eine neue Datei namens exception_classes.py im Verzeichnis ~/project.

    ~/project/exception_classes.py
  3. Fügen Sie den folgenden Code zur Datei exception_classes.py hinzu:

    try:
        result = 10 / 0
    except ZeroDivisionError as e:
        print("Caught a ZeroDivisionError:", e)
    except ArithmeticError as e:
        print("Caught an ArithmeticError:", e)
    except Exception as e:
        print("Caught some other exception:", e)
    
    print("Program continues...")

    In diesem Skript versuchen wir, 10 durch 0 zu teilen, was eine ZeroDivisionError auslösen wird. Wir haben drei except-Blöcke: einen für ZeroDivisionError, einen für ArithmeticError und einen für Exception.

  4. Führen Sie das Skript mit dem folgenden Befehl im Terminal aus:

    python exception_classes.py

    Dadurch wird "Caught a ZeroDivisionError: division by zero" im Terminal ausgegeben.

    Beispielausgabe:

    Caught a ZeroDivisionError: division by zero
    Program continues...

    Die Ausgabe zeigt, dass die ZeroDivisionError vom ersten except-Block abgefangen wurde.

    Jetzt ändern wir das Skript, um eine andere Ausnahme auszulösen.

  5. Ändern Sie die Datei exception_classes.py wie folgt:

    try:
        result = int("abc")
    except ZeroDivisionError as e:
        print("Caught a ZeroDivisionError:", e)
    except ValueError as e:
        print("Caught a ValueError:", e)
    except ArithmeticError as e:
        print("Caught an ArithmeticError:", e)
    except Exception as e:
        print("Caught some other exception:", e)
    
    print("Program continues...")

    In diesem geänderten Skript versuchen wir, die Zeichenkette "abc" in eine Ganzzahl umzuwandeln, was eine ValueError auslösen wird.

  6. Führen Sie das Skript erneut mit demselben Befehl aus:

    python exception_classes.py

    Dadurch wird "Caught a ValueError: invalid literal for int() with base 10: 'abc'" im Terminal ausgegeben.

    Beispielausgabe:

    Caught a ValueError: invalid literal for int() with base 10: 'abc'
    Program continues...

    Diese Ausgabe zeigt, dass die ValueError vom zweiten except-Block abgefangen wurde.

    Indem Sie die Ausnahmeklasse direkt im except-Block angeben, können Sie verschiedene Arten von Ausnahmen auf klare und organisierte Weise behandeln. Dieser Ansatz wird im Allgemeinen für einfache Ausnahmebehandlungen der Verwendung von isinstance() vorgezogen.

Zusammenfassung

In diesem Lab haben Sie die Ausnahmehierarchie in Python untersucht, die für eine effektive Fehlerbehandlung von entscheidender Bedeutung ist. Sie haben gelernt, dass Ausnahmen in einer baumartigen Struktur organisiert sind, wobei BaseException die Basisklasse und Exception die Oberklasse für die meisten eingebauten Ausnahmen ist.

Sie haben ein Python-Skript namens exception_hierarchy.py erstellt, um die Ausnahmehierarchie ab der Exception-Klasse auszugeben. Durch das Ausführen des Skripts haben Sie die baumartige Struktur der Ausnahmen und ihre Beziehungen beobachtet und so ein besseres Verständnis dafür gewonnen, wie Ausnahmen in Python organisiert sind.