Python-Ausnahmebehandlung

Python bietet zwei sehr wichtige Funktionen, um Ausnahmen und Fehler zu behandeln, die während der Ausführung von Python-Programmen auftreten. Sie können diese Funktionen zum Debuggen von Python-Programmen verwenden.

  • Ausnahmebehandlung: Das Python-Tutorial dieser Website wird dies ausführlich behandeln.
  • Zusicherungen: Das Python-Tutorial dieser Website wird dies ausführlich behandeln.

Python-Standard-Ausnahmen

Name der AusnahmeBeschreibung
BaseExceptionBasisklasse für alle Ausnahmen
SystemExitInterpreter hat Beendigung angefordert
KeyboardInterruptBenutzerunterbrechung der Ausführung (normalerweise durch Eingabe von ^C)
AusnahmeBasisklasse für allgemeine Fehler
StopIteration Iterator hat keine weiteren Werte
GeneratorExit Generator löst eine Ausnahme aus, um den Ausstieg zu signalisieren
StandardErrorBasisklasse für alle integrierten Standardausnahmen
ArithmeticError Basisklasse für alle numerischen Berechnungsfehler
FloatingPointError Fehler bei Gleitkommaberechnung
OverflowErrorNumerische Operation überschreitet den Maximalwert
ZeroDivisionErrorDivision (oder Modulo) durch Null (alle Datentypen)
AssertionErrorAssertion-Anweisung fehlgeschlagen
AttributeErrorObjekt hat dieses Attribut nicht
EOFError Keine eingebaute Eingabe, EOF-Marker erreicht
EnvironmentError Basisklasse für Betriebssystemfehler
IOError Eingabe-/Ausgabevorgang fehlgeschlagen
OSError Betriebssystemfehler
WindowsErrorSystemaufruf fehlgeschlagen
ImportError Import von Modul/Objekt fehlgeschlagen
LookupError Basisklasse für ungültige Datenabfragen
IndexErrorKein solcher Index
KeyErrorKein solcher Schlüssel im Mapping
MemoryErrorSpeicherüberlauffehler (nicht fatal für den Python-Interpreter)
NameErrorNicht deklariertes/nicht initialisiertes Objekt (keine Attribute)
UnboundLocalError Zugriff auf eine nicht initialisierte lokale Variable
ReferenceErrorSchwache Referenz versucht, auf ein Objekt zuzugreifen, das bereits durch Garbage Collection entfernt wurde
RuntimeError Allgemeiner Laufzeitfehler
NotImplementedErrorMethode noch nicht implementiert
SyntaxErrorPython-Syntaxfehler
IndentationErrorEinrückungsfehler
TabErrorTabs und Leerzeichen gemischt
SystemError Allgemeiner Systemfehler des Interpreters
TypeErrorUngültige Operation für Typ
ValueError Ungültiges Argument übergeben
UnicodeError Unicode-bezogene Fehler
UnicodeDecodeError Fehler bei der Unicode-Dekodierung
UnicodeEncodeError Fehler bei der Unicode-Kodierung
UnicodeTranslateErrorFehler bei der Unicode-Konvertierung
Warnung Basisklasse für Warnungen
DeprecationWarningWarnung vor veralteten Features
FutureWarning Warnung vor Konstrukten, deren Semantik sich in Zukunft ändern wird
OverflowWarningAlte Warnung vor automatischer Höherstufung zu long integer (long)
PendingDeprecationWarningWarnung vor Features, die künftig als veraltet gelten werden
RuntimeWarning Warnung vor verdächtigem Laufzeitverhalten
SyntaxWarningWarnung wegen verdächtiger Syntax
UserWarningWarnung, die durch Benutzercode erzeugt wird

Was ist eine Ausnahme?

Eine Ausnahme ist ein Ereignis, das während der Programmausführung auftritt und die normale Ausführung des Programms beeinträchtigt.

Im Allgemeinen tritt eine Ausnahme auf, wenn Python ein Programm nicht normal verarbeiten kann.

Ausnahmen sind Python-Objekte, die einen Fehler darstellen.

Wenn in einem Python-Skript eine Ausnahme auftritt, müssen wir sie abfangen und behandeln, andernfalls wird das Programm beendet.


Ausnahmebehandlung

Sie können Ausnahmen mit try/except-Anweisungen abfangen.

Die try/except-Anweisung wird verwendet, um Fehler im try-Block zu erkennen, damit die except-Anweisung Ausnahmeinformationen abfangen und behandeln kann.

Wenn Sie nicht möchten, dass Ihr Programm endet, wenn eine Ausnahme auftritt, fangen Sie sie einfach in einem try ab.

Syntax:

Das Folgende ist die einfachetry....except...elseSyntax:

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

Die Funktionsweise von try ist, dass Python beim Start einer try-Anweisung eine Markierung im Kontext des aktuellen Programms setzt, damit es hierher zurückkehren kann, wenn eine Ausnahme auftritt. Die try-Klausel wird zuerst ausgeführt, und was als Nächstes geschieht, hängt davon ab, ob während der Ausführung eine Ausnahme auftritt.

  • Wenn eine Ausnahme auftritt, während die Anweisung nach try ausgeführt wird, springt Python zu try zurück und führt die erste except-Klausel aus, die zur Ausnahme passt. Nachdem die Ausnahme behandelt wurde, läuft der Kontrollfluss durch die gesamte try-Anweisung (es sei denn, während der Behandlung der Ausnahme wird eine neue Ausnahme ausgelöst).
  • Wenn in der Anweisung nach try eine Ausnahme auftritt, aber keine passende except-Klausel vorhanden ist, wird die Ausnahme an das übergeordnete try oder an die oberste Ebene des Programms weitergegeben (wodurch das Programm beendet und die Standardfehlermeldung ausgegeben wird).
  • Wenn während der Ausführung der try-Klausel keine Ausnahme auftritt, führt Python die Anweisung nach der else-Anweisung aus (falls eine else-Anweisung vorhanden ist); danach läuft der Kontrollfluss durch die gesamte try-Anweisung.

Beispiel

Das Folgende ist ein einfaches Beispiel, das eine Datei öffnet, Inhalt hineinschreibt und bei dem keine Ausnahme auftritt:

Beispiel

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("Dies ist eine Testdatei zum Testen von Ausnahmen!!")
except IOError:
    print "Fehler: Datei nicht gefunden oder Datei konnte nicht gelesen werden"
else:
    print "Inhalt erfolgreich in Datei geschrieben"
    fh.close()

Die Ausgabe des obigen Programms ist:

$ python test.py 
内容写入文件成功
$ cat testfile       # 查看写入的内容
这是一个测试文件,用于测试异常!!

Beispiel

Das Folgende ist ein einfaches Beispiel, das eine Datei öffnet, Inhalt hineinschreibt, bei dem die Datei jedoch keine Schreibberechtigung hat, sodass eine Ausnahme auftritt:

Beispiel

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("Dies ist eine Testdatei zum Testen von Ausnahmen!!")
except IOError:
    print "Fehler: Datei nicht gefunden oder Datei konnte nicht gelesen werden"
else:
    print "Inhalt erfolgreich in Datei geschrieben"
    fh.close()

Bevor wir den Code ausführen, können wir zu Testzwecken zunächst die Schreibberechtigung der Datei testfile entfernen. Der Befehl lautet wie folgt:

chmod -w testfile

Führen Sie dann den obigen Code aus:

$ python test.py 
Error: 没有找到文件或读取文件失败

Verwendung von except ohne Angabe eines Ausnahmetyps

Sie können except ohne Angabe eines Ausnahmetyps verwenden, wie im folgenden Beispiel:

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

Auf diese Weise fängt die try-except-Anweisung alle auftretenden Ausnahmen ab. Dies ist jedoch kein guter Ansatz, denn wir können die spezifischen Ausnahmeinformationen nicht durch das Programm identifizieren, da sie alle Ausnahmen abfängt.


Verwendung von except mit mehreren Ausnahmetypen

Sie können dieselbe except-Anweisung auch verwenden, um mehrere Ausnahmemeldungen zu behandeln, wie unten gezeigt:

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

try-finally-Anweisung

Die try-finally-Anweisung führt den abschließenden Code aus, unabhängig davon, ob eine Ausnahme auftritt.

try:
<语句>
finally:
<语句>    #退出try时总会执行
raise

Beispiel

Beispiel

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("Dies ist eine Testdatei zum Testen von Ausnahmen!!")
finally:
    print "Fehler: Datei nicht gefunden oder Datei konnte nicht gelesen werden"

Wenn die geöffnete Datei keine Schreibberechtigung hat, lautet die Ausgabe wie folgt:

$ python test.py 
Error: 没有找到文件或读取文件失败

Dasselbe Beispiel kann auch auf folgende Weise geschrieben werden:

Beispiel

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    try:
        fh.write("Dies ist eine Testdatei zum Testen von Ausnahmen!!")
    finally:
        print "Close file"
        fh.close()
except IOError:
    print "Fehler: Datei nicht gefunden oder Datei konnte nicht gelesen werden"

Wenn eine Ausnahme im try-Block ausgelöst wird, wird der Code im finally-Block sofort ausgeführt.

Nachdem alle Anweisungen im finally-Block ausgeführt wurden, wird die Ausnahme erneut ausgelöst, und der Code im except-Block wird ausgeführt.

Der Inhalt des Parameters unterscheidet sich von der Ausnahme.


Ausnahme-Argumente

Eine Ausnahme kann Argumente mitführen, die als Parameter zur Ausgabe von Ausnahmeinformationen verwendet werden können.

Sie können die Argumente einer Ausnahme über die except-Anweisung abfangen, wie unten gezeigt:

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在这输出 Argument 的值...

Der von der Variable empfangene Ausnahmewert ist normalerweise in der Ausnahmeanweisung enthalten. Die Variable kann einen oder mehrere Werte in Form eines Tupels empfangen.

Das Tupel enthält normalerweise den Fehlerstring, die Fehlernummer und den Fehlerort.

Beispiel

Das Folgende ist ein Beispiel für eine einzelne Ausnahme:

Beispiel

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# Funktion definieren
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print "Argument enthält keine Zahl"\n", Argument

# Funktion aufrufen
temp_convert("xyz")

Das Ausführungsergebnis des obigen Programms lautet wie folgt:

$ python test.py 
参数没有包含数字
invalid literal for int() with base 10: 'xyz'

Ausnahmen auslösen

Wir können die raise-Anweisung verwenden, um selbst eine Ausnahme auszulösen

Die Syntax von raise ist wie folgt:

raise [Exception [, args [, traceback]]]

In der Anweisung ist Exception der Typ der Ausnahme (z. B. NameError), eine der Standardausnahmen; args ist das Ausnahme-Argument, das Sie selbst angeben.

Der letzte Parameter ist optional (wird in der Praxis selten verwendet); falls vorhanden, ist er das Traceback-Objekt.

Beispiel

Eine Ausnahme kann eine Zeichenkette, eine Klasse oder ein Objekt sein. Die meisten vom Python-Kern bereitgestellten Ausnahmen sind instanziierte Klassen, die Parameter einer Klasseninstanz sind.

Das Definieren einer Ausnahme ist sehr einfach, wie unten gezeigt:

Beispiel

def functionName( level ):
    if level < 1:
        raise Exception("Ungültiges Level!", level)
        # Nachdem die Ausnahme ausgelöst wurde, wird der nachfolgende Code nicht ausgeführt

Hinweis:Um eine Ausnahme abzufangen, muss die "except"-Anweisung dasselbe Ausnahmeklassenobjekt oder denselben String verwenden, der ausgelöst wurde.

Um die obige Ausnahme abzufangen, lautet die "except"-Anweisung zum Beispiel wie folgt:

try:
    正常逻辑
except Exception,err:
    触发自定义异常    
else:
    其余代码

Beispiel

Beispiel

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# Eine Funktion definieren
def mye( level ):
    if level < 1:
        raise Exception,"Ungültiges Level!"
        # Nachdem die Ausnahme ausgelöst wurde, wird der nachfolgende Code nicht ausgeführt
try:
    mye(0)            # Die Ausnahme auslösen
except Exception,err:
    print 1,err
else:
    print 2

Wenn Sie den obigen Code ausführen, ist die Ausgabe:

$ python test.py 
1 Invalid level!

Benutzerdefinierte Ausnahmen

Durch Erstellen einer neuen Ausnahmeklasse können Programme ihre eigenen Ausnahmen benennen. Ausnahmen sollten typischerweise direkt oder indirekt von der Exception-Klasse erben.

Das Folgende ist ein Beispiel im Zusammenhang mit RuntimeError. In dem Beispiel wird eine Klasse mit der Basisklasse RuntimeError erstellt, die verwendet wird, um mehr Informationen auszugeben, wenn die Ausnahme ausgelöst wird.

Im try-Block wird der except-Block ausgeführt, nachdem die benutzerdefinierte Ausnahme ausgelöst wurde. Die Variable e wird verwendet, um eine Instanz der Klasse Networkerror zu erstellen.

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

Nachdem die obige Klasse definiert wurde, können Sie die Ausnahme wie folgt auslösen:

try:
    raise Networkerror("Bad hostname")
except Networkerror,e:
    print e.args
Andere Erweiterungen