Catch Me If You Can: Ein Leitfaden zur Ausnahmebehandlung in Python

May 09 2023
Erschließen Sie das volle Potenzial von Python durch intelligentes Ausnahmemanagement Als Softwareentwickler wird der Umgang mit Ausnahmen oft als notwendiges Übel angesehen. Die Beherrschung des Ausnahmebehandlungssystems von Python kann Sie jedoch zu einem effizienteren und effektiveren Programmierer machen.

Schöpfen Sie das volle Potenzial von Python durch intelligentes Ausnahmemanagement aus

Foto von Cookie the Pom auf Unsplash

Als Softwareentwickler wird der Umgang mit Ausnahmen oft als notwendiges Übel angesehen. Die Beherrschung des Ausnahmebehandlungssystems von Python kann Sie jedoch zu einem effizienteren und effektiveren Programmierer machen.

In diesem Blog-Beitrag werde ich die folgenden Punkte ausführlich erläutern:

  • Was ist Ausnahmebehandlung?
  • Der Unterschied zwischen ifAnweisungen und Ausnahmebehandlung
  • Verwendung elseund finallyKlauseln für ein ordnungsgemäßes Fehlermanagement
  • Benutzerdefinierte Ausnahmen definieren
  • Best Practices für die Ausnahmebehandlung

Die Ausnahmebehandlung ist ein Prozess zum Schreiben von Code zum Abfangen und Behandeln von Fehlern oder Ausnahmen, die während der Programmausführung auftreten können. Auf diese Weise können Entwickler robusten Code schreiben, der auch angesichts unerwarteter Ereignisse oder Fehler weiter ausgeführt wird, anstatt vollständig abzustürzen.

Wenn eine Ausnahme auftritt, sucht Python nach einem passenden Ausnahmehandler. Der Handler-Code wird ausgeführt und ergreift geeignete Aktionen, wie z. B. das Protokollieren des Fehlers, das Anzeigen einer Fehlermeldung oder der Versuch, den Fehler zu beheben. Insgesamt trägt die Ausnahmebehandlung dazu bei, Python-Anwendungen zuverlässiger, wartbarer und einfacher zu debuggen.

Der Unterschied zwischen ifAnweisungen und Ausnahmebehandlung

Die Hauptunterschiede zwischen ifAnweisungen und Ausnahmebehandlung in Python liegen in ihren jeweiligen Zielen und Verwendungsszenarien.

Die ifAnweisung dient als Grundbaustein für die strukturierte Programmierung. Es wertet eine Bedingung aus und führt verschiedene Codeblöcke aus, je nachdem, ob die Bedingung wahr oder falsch ist. Hier ist ein Beispiel:

temperature = int(input("Please enter temperature in Fahrenheit: "))
if temperature > 100:
    print("Hot weather alert! Temperature exceeded 100°F.")
elif temperature >= 70:
    print("Warm day ahead, enjoy sunny skies.")
else:
    print("Bundle up for chilly temperatures.")

Ausnahmen werden verwendet, um Probleme zu signalisieren und Bereiche im Code anzuzeigen, die verbessert, debuggt oder zusätzliche Maßnahmen zur Fehlerprüfung benötigt werden. Sie ermöglichen es Python, fehlerhafte Situationen elegant zu handhaben und das Skript weiter auszuführen, anstatt es abrupt zu beenden.

Betrachten Sie das folgende Beispiel, wie Sie die Ausnahmebehandlung implementieren könnten, um potenzielle Fehler im Zusammenhang mit der Division durch Null besser zu verwalten:

# Define a function that tries to divide a number by zero
def divide(x, y):
    result = x / y
    return result
# Call the divide function with x=5 and y=0
result = divide(5, 0)
print(f"Result of dividing {x} by {y}: {result}")

Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
ZeroDivisionError: division by zero attempted

Wir können die obige Ausnahme behandeln, indem wir den Aufruf der Funktion „divide“ try-exceptwie folgt in einen Block einschließen:

# Define a function that tries to divide a number by zero
def divide(x, y):
    result = x / y
    return result
# Call the divide function with x=5 and y=0
try:
    result = divide(5, 0)
    print(f"Result of dividing {x} by {y}: {result}")
except ZeroDivisionError:
    print("Cannot divide by zero.")

Cannot divide by zero.

Weitere Informationen zu den eingebauten Ausnahmen in Python finden Sie unter [2] .

Verwenden von Else- und Final-Klauseln für eine ordnungsgemäße Fehlerverwaltung

elseBei der Arbeit mit Ausnahmen in Python wird empfohlen, sowohl als auch finallyKlauseln in Ihre Blöcke aufzunehmen try-except. Mit der elseKlausel können Sie angeben, was passieren soll, wenn keine Ausnahme ausgelöst wird, während die finallyKlausel sicherstellt, dass bestimmte Bereinigungsvorgänge immer durchgeführt werden, unabhängig davon, ob eine Ausnahme aufgetreten ist [1] [2] .

Stellen Sie sich beispielsweise ein Szenario vor, in dem Sie Daten aus einer Datei lesen und einige Vorgänge mit diesen Daten ausführen möchten. Wenn beim Lesen der Datei eine Ausnahme auftritt, möchten Sie möglicherweise den Fehler protokollieren und die weitere Verarbeitung stoppen, aber Sie möchten die Datei trotzdem ordnungsgemäß schließen.

Mit den Klauseln elseund finallykönnen Sie genau das tun – die Daten normal verarbeiten, wenn keine Ausnahme auftritt, oder alle Ausnahmen entsprechend behandeln, während die Datei am Ende immer noch geschlossen wird. Ohne diese Klauseln wäre Ihr Code anfällig für Ressourcenlecks oder unvollständige Fehlerbehandlung. Daher spielen sie eine wesentliche Rolle bei der Erstellung robuster und zuverlässiger Programme.

try:
    # Open the file in read mode
    file = open("file.txt", "r")
    print("Successful opened the file")
except FileNotFoundError:
    # Handle missing files
    print("File Not Found Error: No such file or directory")
    exit()
except PermissionError:
    # Handle permission issues
    print("Permission Denied Error: Access is denied")
else:
    # All good, do something with the file data
    content = file.read().decode('utf-8')
    processed_data = process_content(content)
    
# Cleanup after ourselves even if an exception occurred above
finally:
    file.close()

Andernfalls, wenn innerhalb des tryBlocks keine Ausnahmen auftreten, fahren wir mit der Verarbeitung des Dateiinhalts in der elseVerzweigung fort. Schließlich schließt die durch den Block sichergestellte Bereinigungsoperation finallydie Datei unabhängig davon, ob zuvor eine Ausnahme ausgelöst wurde oder nicht [1] .

Durch die Annahme eines strukturierten Ansatzes wie diesem bleibt Ihr Code organisiert und leicht verständlich, während potenzielle Fehler berücksichtigt werden, die sich aus der Interaktion mit externen Systemen oder Eingaben ergeben können.

Benutzerdefinierte Ausnahmen definieren

In Python können Sie benutzerdefinierte Ausnahmen definieren, indem Sie integrierte Ausnahmen wie Exceptionoder jede andere Klasse, die direkt von Exception.

Dazu müssen Sie eine neue Klasse erstellen, die von einer dieser Basisausnahmen erbt, und spezifische Attribute für Ihre Anforderungen hinzufügen. Sie können dann Ihre neu definierte Ausnahmeklasse im gesamten Code verwenden, genau wie Sie jede andere integrierte Ausnahmeklasse verwenden würden.

Hier ist ein Beispiel für die Definition einer benutzerdefinierten Ausnahme namens InvalidEmailAddress:

class InvalidEmailAddress(ValueError):
    def __init__(self, message):
        super().__init__(message)
        self.msgfmt = message

Sie können diese Ausnahme immer dann auslösen, wenn Sie auf ein ungültiges E-Mail-Adressformat stoßen:

def send_email(address):
    if isinstance(address, str) == False:
        raise InvalidEmailAddress("Invalid email address")
# Send email

>>> send_email(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/path/to/project/main.py", line 8, in send_email
    raise InvalidEmailAddress("Invalid email address")
InvalidEmailAddress: Invalid email address

Hier sind einige Best Practices zur Fehlerbehandlung in Python:

  1. Design for Failure : Planen Sie im Voraus, indem Sie mögliche Fehler berücksichtigen und Ihr Programm so gestalten, dass es angemessen damit umgeht. Das bedeutet, Randfälle zu antizipieren und geeignete Fehlerbehandler zu implementieren.
  2. Beschreibende Fehlermeldungen verwenden : Stellen Sie detaillierte Fehlermeldungen oder Protokolle bereit, die den Benutzern helfen zu verstehen, was schief gelaufen ist und warum. Vermeiden Sie allgemeine Fehlermeldungen wie „Fehler aufgetreten“ oder „Es ist etwas Schlimmes passiert“. Zeigen Sie stattdessen eine freundliche Nachricht an, die Lösungen vorschlägt oder Links zur Dokumentation enthält. Stellen Sie sicher, dass Sie ein Gleichgewicht finden zwischen der Bereitstellung detaillierter Anweisungen und der Vermeidung, die Benutzeroberfläche mit irrelevanten Inhalten zu überladen.
  3. Nebeneffekte minimieren : Minimieren Sie die Folgen fehlgeschlagener Aktionen, indem Sie problematische Codeabschnitte durch try-finally- oder try-with-resources-Blöcke isolieren. Stellen Sie sicher, dass Bereinigungsaufgaben unabhängig von Erfolg oder Misserfolg immer ausgeführt werden.
  4. Gründlich testen : Gründlich testen: Stellen Sie sicher, dass sich Ihre Ausnahmehandler in verschiedenen Szenarien korrekt verhalten, indem Sie umfassende Tests durchführen.
  5. Refaktorieren Sie regelmäßig : Refaktorieren Sie fehleranfällige Codesegmente, um ihre Zuverlässigkeit und Leistung zu verbessern. Halten Sie Ihre Codebasis modular und lose gekoppelt, sodass sich unabhängige Teile unabhängig entwickeln können, ohne andere negativ zu beeinflussen.
  6. Wichtige Ereignisse protokollieren: Verfolgen Sie interessante Ereignisse in Ihrer Anwendung, indem Sie sie in einer Datei oder Konsolenausgabe protokollieren. Auf diese Weise können Sie Probleme schnell diagnostizieren, ohne große Mengen unstrukturierter Protokolle durchsuchen zu müssen.

Das Schreiben von Fehlerbehandlungscode ist ein wesentlicher Bestandteil der Softwareentwicklung, insbesondere bei der Arbeit mit Python, da es Entwicklern ermöglicht, zuverlässigere und robustere Anwendungen zu erstellen. Durch die Einhaltung von Industriestandards und Best Practices können Entwickler die Debugging-Zeit verkürzen, die Codequalität sicherstellen und eine bessere Benutzererfahrung bieten.

Ressourcen

[1]https://docs.python.org/3/tutorial/errors.html

[2]https://www.geeksforgeeks.org/python-exception-handling/