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.
Verstehen Sie die Ausnahmehierarchie
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.
Öffnen Sie Ihren VS Code-Editor.
Erstellen Sie eine neue Datei namens
exception_hierarchy.pyim Verzeichnis~/project.~/project/exception_hierarchy.pyFügen Sie den folgenden Code zur Datei
exception_hierarchy.pyhinzu: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 derException-Klasse ausgibt.Führen Sie das Skript mit dem folgenden Befehl im Terminal aus:
python exception_hierarchy.pyDadurch 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
Exceptiondie 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 wieZeroDivisionErroroder eine allgemeinere Ausnahme wieArithmeticError(die Elternklasse vonZeroDivisionErrorist) abfangen.
Verwenden Sie 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.
Öffnen Sie Ihren VS Code-Editor.
Erstellen Sie eine neue Datei namens
isinstance_exception.pyim Verzeichnis~/project.~/project/isinstance_exception.pyFügen Sie den folgenden Code zur Datei
isinstance_exception.pyhinzu: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
ZeroDivisionErrorauslösen wird. Anschließend fangen wir die Ausnahme ab und verwendenisinstance(), um zu prüfen, ob es sich um eine Instanz vonZeroDivisionErroroderArithmeticErrorhandelt.Führen Sie das Skript mit dem folgenden Befehl im Terminal aus:
python isinstance_exception.pyDadurch 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 vonZeroDivisionErroridentifiziert hat. DaZeroDivisionErroreine Unterklasse vonArithmeticErrorist, wird die ersteif-Bedingung erfüllt, und die entsprechende Nachricht wird ausgegeben.Jetzt ändern wir das Skript, um eine allgemeinere Ausnahme abzufangen.
Ändern Sie die Datei
isinstance_exception.pywie 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
ValueErrorauslösen wird.Führen Sie das Skript erneut mit demselben Befehl aus:
python isinstance_exception.pyDadurch 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üfen 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.
Öffnen Sie Ihren VS Code-Editor.
Erstellen Sie eine neue Datei namens
exception_classes.pyim Verzeichnis~/project.~/project/exception_classes.pyFügen Sie den folgenden Code zur Datei
exception_classes.pyhinzu: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
ZeroDivisionErrorauslösen wird. Wir haben dreiexcept-Blöcke: einen fürZeroDivisionError, einen fürArithmeticErrorund einen fürException.Führen Sie das Skript mit dem folgenden Befehl im Terminal aus:
python exception_classes.pyDadurch wird "Caught a ZeroDivisionError: division by zero" im Terminal ausgegeben.
Beispielausgabe:
Caught a ZeroDivisionError: division by zero Program continues...Die Ausgabe zeigt, dass die
ZeroDivisionErrorvom erstenexcept-Block abgefangen wurde.Jetzt ändern wir das Skript, um eine andere Ausnahme auszulösen.
Ändern Sie die Datei
exception_classes.pywie 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
ValueErrorauslösen wird.Führen Sie das Skript erneut mit demselben Befehl aus:
python exception_classes.pyDadurch 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
ValueErrorvom zweitenexcept-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 vonisinstance()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.



