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 Ausnahme | Beschreibung |
|---|---|
| BaseException | Basisklasse für alle Ausnahmen |
| SystemExit | Interpreter hat Beendigung angefordert |
| KeyboardInterrupt | Benutzerunterbrechung der Ausführung (normalerweise durch Eingabe von ^C) |
| Ausnahme | Basisklasse für allgemeine Fehler |
| StopIteration | Iterator hat keine weiteren Werte |
| GeneratorExit | Generator löst eine Ausnahme aus, um den Ausstieg zu signalisieren |
| StandardError | Basisklasse für alle integrierten Standardausnahmen |
| ArithmeticError | Basisklasse für alle numerischen Berechnungsfehler |
| FloatingPointError | Fehler bei Gleitkommaberechnung |
| OverflowError | Numerische Operation überschreitet den Maximalwert |
| ZeroDivisionError | Division (oder Modulo) durch Null (alle Datentypen) |
| AssertionError | Assertion-Anweisung fehlgeschlagen |
| AttributeError | Objekt hat dieses Attribut nicht |
| EOFError | Keine eingebaute Eingabe, EOF-Marker erreicht |
| EnvironmentError | Basisklasse für Betriebssystemfehler |
| IOError | Eingabe-/Ausgabevorgang fehlgeschlagen |
| OSError | Betriebssystemfehler |
| WindowsError | Systemaufruf fehlgeschlagen |
| ImportError | Import von Modul/Objekt fehlgeschlagen |
| LookupError | Basisklasse für ungültige Datenabfragen |
| IndexError | Kein solcher Index |
| KeyError | Kein solcher Schlüssel im Mapping |
| MemoryError | Speicherüberlauffehler (nicht fatal für den Python-Interpreter) |
| NameError | Nicht deklariertes/nicht initialisiertes Objekt (keine Attribute) |
| UnboundLocalError | Zugriff auf eine nicht initialisierte lokale Variable |
| ReferenceError | Schwache Referenz versucht, auf ein Objekt zuzugreifen, das bereits durch Garbage Collection entfernt wurde |
| RuntimeError | Allgemeiner Laufzeitfehler |
| NotImplementedError | Methode noch nicht implementiert |
| SyntaxError | Python-Syntaxfehler |
| IndentationError | Einrückungsfehler |
| TabError | Tabs und Leerzeichen gemischt |
| SystemError | Allgemeiner Systemfehler des Interpreters |
| TypeError | Ungü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 |
| UnicodeTranslateError | Fehler bei der Unicode-Konvertierung |
| Warnung | Basisklasse für Warnungen |
| DeprecationWarning | Warnung vor veralteten Features |
| FutureWarning | Warnung vor Konstrukten, deren Semantik sich in Zukunft ändern wird |
| OverflowWarning | Alte Warnung vor automatischer Höherstufung zu long integer (long) |
| PendingDeprecationWarning | Warnung vor Features, die künftig als veraltet gelten werden |
| RuntimeWarning | Warnung vor verdächtigem Laufzeitverhalten |
| SyntaxWarning | Warnung wegen verdächtiger Syntax |
| UserWarning | Warnung, 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
# -*- 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
# -*- 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
# -*- 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
# -*- 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
# -*- 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
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
# -*- 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