Python Ausnahmebehandlung mit try, except und finally: Grundlagen und Best Practices

1. Was sind Python-Ausnahmen?

Python-Ausnahmen sind eine Art von Fehler, die während der Programmausführung auftreten. Normalerweise führt ein Programm den Code von oben nach unten aus. Wenn jedoch unter bestimmten Umständen ein Fehler auftritt, wird die Ausführung des Codes an dieser Stelle unterbrochen und eine Ausnahme ausgelöst. Wenn Sie beispielsweise versuchen, durch Null zu dividieren, tritt ein ZeroDivisionError auf; wenn Sie versuchen, auf einen nicht existierenden Listenindex zuzugreifen, tritt ein IndexError auf.

1.1 Häufige Arten von Ausnahmen

Python verfügt über viele integrierte Ausnahmen. Einige gängige Beispiele sind unten aufgeführt.

     

  • ValueError: Wenn eine Funktion einen ungeeigneten Wert empfängt
  •  

  • TypeError: Wenn eine Operation oder Funktion auf einem ungültigen Datentyp ausgeführt wird
  •  

  • IndexError: Wenn auf einen Index außerhalb des Bereichs einer Sequenz (wie einer Liste) zugegriffen wird
  •  

  • ZeroDivisionError: Wenn versucht wird, durch Null zu dividieren

Diese Ausnahmen bieten nützliche Diagnoseinformationen, wenn unerwartete Fehler während der Programmausführung auftreten.

2. Grundlegende Ausnahmebehandlung mit try und except

In Python wird die Ausnahmebehandlung mithilfe von try und except durchgeführt. Dies verhindert, dass das Programm bei einem Fehler abbricht, und ermöglicht, dass andere Teile des Programms weiter ausgeführt werden, selbst wenn ein Fehler auftritt.

2.1 Grundlegende Syntax

Platzieren Sie den Code, in dem ein Fehler auftreten könnte, im try-Block und schreiben Sie den Code, der ausgeführt werden soll, wenn dieser Fehler auftritt, in den except-Block.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("ゼロで割ることはできません。")

In diesem Beispiel wird, wenn ein ZeroDivisionError auftritt, der except-Block ausgeführt und „Durch Null kann nicht dividiert werden.“ ausgegeben.

2.2 Mehrere except-Blöcke

Wenn Sie mehrere verschiedene Ausnahmen behandeln möchten, können Sie mehrere except-Blöcke verwenden. Sie können beispielsweise unterschiedliche Aktionen für verschiedene Fehler wie NameError oder TypeError durchführen.

try:
    print(a)
except NameError:
    print('変数aの値が定義されていません。')
except TypeError:
    print('不正な型が使用されました。')

In diesem Code tritt ein NameError auf, da a nicht definiert ist, und die entsprechende Meldung wird angezeigt.

3. Umgang mit mehreren Ausnahmen gleichzeitig

Wenn in einem Programm mehrere verschiedene Arten von Ausnahmen auftreten können, können diese in einem einzigen except-Block zusammen behandelt werden.

3.1 Mehrere Ausnahmen in einem einzigen except-Block behandeln

Wie folgt können Sie im except-Block mehrere Ausnahmen als Tupel angeben.

try:
    num = int(input("数字を入力してください: "))
    result = 10 / num
except (ValueError, ZeroDivisionError):
    print("無効な入力が行われたか、ゼロで割り算を試みました。")

In diesem Beispiel werden Fehler zusammen behandelt, wenn der Benutzer einen ungültigen Wert oder Null eingibt und versucht, eine Division durchzuführen, und es wird „Ungültige Eingabe oder Versuch, durch Null zu dividieren.“ ausgegeben.

3.2 Ausnahmen mithilfe der übergeordneten Klasse behandeln

Die Exception-Klasse ist die übergeordnete Klasse der meisten integrierten Ausnahmen. Wenn Sie alle Ausnahmen abfangen möchten, können Sie diese Klasse verwenden. Da diese Methode jedoch sehr umfassend ist, ist Vorsicht geboten.

try:
    # エラーが発生する可能性のあるコード
except Exception as e:
    print("エラーが発生しました:", e)

Mit dieser Methode wird jede auftretende Ausnahme abgefangen und eine Meldung angezeigt. Es wird jedoch empfohlen, das Design so zu gestalten, dass möglichst spezifische Ausnahmen behandelt werden.

4. Ausnahmen auslösen (raise)

Während der Programmausführung können Sie manuell eine Ausnahme auslösen, wenn eine bestimmte Bedingung nicht erfüllt ist. Verwenden Sie dazu die raise-Anweisung.

4.1 Verwendung der raise-Anweisung

Das folgende Beispiel löst einen ValueError aus, wenn ein negativer Wert übergeben wird.

def check_value(value):
    if value < 0:
        raise ValueError("負の値は許可されていません。")
    return value

try:
    result = check_value(-1)
except ValueError as e:
    print(e)

In diesem Beispiel wird der negative Wert -1 an die check_value-Funktion übergeben, wodurch ein ValueError ausgelöst und die Meldung „Negative Werte sind nicht erlaubt.“ angezeigt wird.

4.2 Anwendung von raise

Die raise-Anweisung kann auch zum Definieren benutzerdefinierter Ausnahmeklassen verwendet werden. Indem Sie eigene Ausnahmen erstellen und diese unter bestimmten Bedingungen auslösen, können Sie die Fehlerbehandlung Ihres Programms flexibler gestalten.

年収訴求

5. Abrufen von Ausnahmeinformationen

Wenn eine Ausnahme auftritt, können Sie durch das Abrufen detaillierter Informationen die Fehlerdiagnose und das Debugging erleichtern. Sie können das Ausnahmeobjekt abrufen, indem Sie die as-Klausel im except-Block verwenden.

5.1 Verwendung der as-Klausel

Das folgende Beispiel ruft das Ausnahmeobjekt als e ab und zeigt dessen Meldung an.

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print("エラーが発生しました:", e)

In diesem Code wird, wenn ein ZeroDivisionError auftritt, die Meldung „Es ist ein Fehler aufgetreten: division by zero“ angezeigt. Das Ausnahmeobjekt enthält detaillierte Informationen wie den Ausnahmetyp und die Fehlermeldung.

5.2 Nutzung von Ausnahmeobjekten

Ausnahmeobjekte können nicht nur zur Anzeige von Fehlermeldungen, sondern auch zur Protokollierung und zur Durchführung zusätzlicher Aktionen für bestimmte Fehler verwendet werden. Beispielsweise können Sie Fehlermeldungen in eine Protokolldatei schreiben, um sie später beim Debugging zu nutzen.

6. Best Practices für die Ausnahmebehandlung

Effektive Ausnahmebehandlung verbessert die Robustheit und Zuverlässigkeit eines Programms. Im Folgenden werden einige Best Practices für die Ausnahmebehandlung in Python vorgestellt.

6.1 Spezifische Ausnahmen abfangen

Versuchen Sie, möglichst spezifische Ausnahmen abzufangen. Anstatt eine breite Exception abzufangen, fangen Sie spezifische, erwartete Ausnahmen wie ValueError oder TypeError ab. Dadurch wird die Fehlerbehandlung klarer und zielgerichteter.

6.2 Ausnahmen protokollieren

Das Protokollieren von Fehlermeldungen erleichtert die spätere Identifizierung der Fehlerursache. Insbesondere in großen Programmen oder Systemen ist es wichtig, Informationen über das Auftreten von Ausnahmen aufzuzeichnen.

6.3 Graceful Degradation

Es ist wichtig, eine „Graceful Degradation“ (sanfte Herabstufung) zu gestalten, damit das Programm bei einer Ausnahme nicht vollständig abstürzt. Durch die Anzeige benutzerfreundlicher Fehlermeldungen oder die Ausführung alternativer Aktionen kann beispielsweise die Zuverlässigkeit des Programms verbessert werden.

6.4 Redundante Ausnahmebehandlung vermeiden

Vermeiden Sie es, alle Ausnahmen abzufangen und sie dann einfach zu ignorieren. Dies erschwert das Debugging und kann zu unerwartetem Programmverhalten führen. Wenn eine Ausnahme abgefangen wird, sollten Sie zumindest die Fehlermeldung protokollieren oder eine entsprechende Verarbeitung durchführen.

6.5 Nutzung des finally-Blocks

Der finally-Block wird verwendet, um Code zu schreiben, der immer ausgeführt wird, unabhängig davon, ob eine Ausnahme auftritt oder nicht. Hier können Sie Verarbeitungen schreiben, die unbedingt ausgeführt werden müssen, wie das Schließen von Dateien oder das Freigeben von Ressourcen.

try:
    file = open("example.txt", "r")
    # ファイルを読み取る処理
except FileNotFoundError:
    print("ファイルが見つかりません。")
finally:
    file.close()

In diesem Beispiel stellt der finally-Block sicher, dass die Datei geschlossen wird, selbst wenn das Öffnen der Datei fehlgeschlagen ist.

7. Zusammenfassung

Die Python-Ausnahmebehandlung ist eine wichtige Technik, die die Zuverlässigkeit von Programmen erhöht und eine angemessene Reaktion auf Fehler ermöglicht. Durch das Abfangen von Fehlern mit try und except und das Erstellen benutzerdefinierter Ausnahmen mit raise können Sie die Flexibilität und Wartbarkeit Ihres Codes verbessern.

     

  • Wir haben verstanden, was Ausnahmen sind, und die gängigen Arten von Ausnahmen kennengelernt.
  •  

  • Wir haben gelernt, wie man eine grundlegende Ausnahmebehandlung mit try und except durchführt.
  •  

  • Wir haben gesehen, wie man mehrere Ausnahmen in einem einzigen except-Block gleichzeitig behandelt.
  •  

  • Wir haben die Verwendung der raise-Anweisung zum Auslösen von Ausnahmen und ihre Anwendung gelernt.
  •  

  • Wir haben gelernt, wie man Ausnahmeobjekte abruft, um detaillierte Fehlerinformationen zu erhalten.
  •  

  • Zuletzt haben wir die Best Practices für die Ausnahmebehandlung betrachtet und die Gestaltung einer effektiven Fehlerbehandlung besprochen.

Ausnahmebehandlung ist eine unverzichtbare Technik, um die Zuverlässigkeit von Programmen zu gewährleisten. Nutzen Sie diese Techniken, um benutzerfreundliche und robuste Python-Anwendungen zu entwickeln.