Python - Ausnahmebehandlung
Python bietet zwei sehr wichtige Funktionen, um unerwartete Fehler in Ihren Python-Programmen zu behandeln und ihnen Debugging-Funktionen hinzuzufügen:
Exception Handling- Dies wird in diesem Tutorial behandelt. Hier ist eine Liste der in Python verfügbaren Standardausnahmen : Standardausnahmen .
Assertions- Dies wird im Assertions in Python- Tutorial behandelt.
Liste der Standardausnahmen -
Sr.Nr. | Ausnahme Name & Beschreibung |
---|---|
1 | Exception Basisklasse für alle Ausnahmen |
2 | StopIteration Wird ausgelöst, wenn die next () -Methode eines Iterators nicht auf ein Objekt zeigt. |
3 | SystemExit Wird durch die Funktion sys.exit () ausgelöst. |
4 | StandardError Basisklasse für alle integrierten Ausnahmen außer StopIteration und SystemExit. |
5 | ArithmeticError Basisklasse für alle Fehler, die bei der numerischen Berechnung auftreten. |
6 | OverflowError Wird ausgelöst, wenn eine Berechnung die maximale Grenze für einen numerischen Typ überschreitet. |
7 | FloatingPointError Wird ausgelöst, wenn eine Gleitkommaberechnung fehlschlägt. |
8 | ZeroDivisionError Wird ausgelöst, wenn für alle numerischen Typen eine Division oder ein Modulo durch Null erfolgt. |
9 | AssertionError Wird ausgelöst, wenn die Assert-Anweisung fehlschlägt. |
10 | AttributeError Wird ausgelöst, wenn die Attributreferenz oder -zuweisung fehlschlägt. |
11 | EOFError Wird ausgelöst, wenn weder von der Funktion raw_input () noch von input () eine Eingabe erfolgt und das Dateiende erreicht ist. |
12 | ImportError Wird ausgelöst, wenn eine Importanweisung fehlschlägt. |
13 | KeyboardInterrupt Wird ausgelöst, wenn der Benutzer die Programmausführung unterbricht, normalerweise durch Drücken von Strg + c. |
14 | LookupError Basisklasse für alle Suchfehler. |
15 | IndexError Wird ausgelöst, wenn in einer Sequenz kein Index gefunden wird. |
16 | KeyError Wird ausgelöst, wenn der angegebene Schlüssel nicht im Wörterbuch gefunden wird. |
17 | NameError Wird ausgelöst, wenn im lokalen oder globalen Namespace kein Bezeichner gefunden wird. |
18 | UnboundLocalError Wird ausgelöst, wenn versucht wird, auf eine lokale Variable in einer Funktion oder Methode zuzugreifen, ihr jedoch kein Wert zugewiesen wurde. |
19 | EnvironmentError Basisklasse für alle Ausnahmen, die außerhalb der Python-Umgebung auftreten. |
20 | IOError Wird ausgelöst, wenn eine Eingabe- / Ausgabeoperation fehlschlägt, z. B. die print-Anweisung oder die open () -Funktion, wenn versucht wird, eine nicht vorhandene Datei zu öffnen. |
21 | IOError Wird für betriebssystembezogene Fehler ausgelöst. |
22 | SyntaxError Wird ausgelöst, wenn ein Fehler in der Python-Syntax vorliegt. |
23 | IndentationError Wird ausgelöst, wenn die Einrückung nicht richtig angegeben ist. |
24 | SystemError Wird ausgelöst, wenn der Interpreter ein internes Problem findet, dieser Fehler jedoch auftritt. Der Python-Interpreter wird nicht beendet. |
25 | SystemExit Wird ausgelöst, wenn der Python-Interpreter mithilfe der Funktion sys.exit () beendet wird. Wenn dies nicht im Code behandelt wird, wird der Interpreter beendet. |
26 | TypeError Wird ausgelöst, wenn eine Operation oder Funktion versucht wird, die für den angegebenen Datentyp ungültig ist. |
27 | ValueError Wird ausgelöst, wenn die integrierte Funktion für einen Datentyp den gültigen Argumenttyp hat, für die Argumente jedoch ungültige Werte angegeben sind. |
28 | RuntimeError Wird ausgelöst, wenn ein generierter Fehler keiner Kategorie zugeordnet werden kann. |
29 | NotImplementedError Wird ausgelöst, wenn eine abstrakte Methode, die in einer geerbten Klasse implementiert werden muss, nicht tatsächlich implementiert ist. |
Behauptungen in Python
Eine Behauptung ist eine Überprüfung der geistigen Gesundheit, die Sie ein- oder ausschalten können, wenn Sie mit dem Testen des Programms fertig sind.
Der einfachste Weg, sich eine Behauptung vorzustellen, besteht darin, sie mit einer zu vergleichen raise-ifAussage (oder genauer gesagt, eine Raise-If-Not-Aussage). Ein Ausdruck wird getestet, und wenn das Ergebnis falsch ist, wird eine Ausnahme ausgelöst.
Assertions werden von der assert-Anweisung ausgeführt, dem neuesten Schlüsselwort für Python, das in Version 1.5 eingeführt wurde.
Programmierer platzieren häufig Zusicherungen am Anfang einer Funktion, um nach gültigen Eingaben zu suchen, und nach einem Funktionsaufruf, um nach gültigen Ausgaben zu suchen.
Die Assert- Erklärung
Wenn Python auf eine Assert-Anweisung stößt, wertet er den zugehörigen Ausdruck aus, was hoffentlich wahr ist. Wenn der Ausdruck falsch ist, löst Python eine AssertionError- Ausnahme aus.
Das syntax für behaupten ist -
assert Expression[, Arguments]
Wenn die Zusicherung fehlschlägt, verwendet Python ArgumentExpression als Argument für den AssertionError. AssertionError-Ausnahmen können wie jede andere Ausnahme mit der try-exception-Anweisung abgefangen und behandelt werden. Wenn sie jedoch nicht behandelt werden, wird das Programm beendet und ein Traceback erstellt.
Beispiel
Hier ist eine Funktion, die eine Temperatur von Grad Kelvin in Grad Fahrenheit umwandelt. Da null Grad Kelvin so kalt ist wie es nur geht, wird die Funktion beendet, wenn eine negative Temperatur festgestellt wird -
#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
Was ist eine Ausnahme?
Eine Ausnahme ist ein Ereignis, das während der Ausführung eines Programms auftritt und den normalen Ablauf der Programmanweisungen stört. Wenn ein Python-Skript auf eine Situation stößt, die es nicht bewältigen kann, wird im Allgemeinen eine Ausnahme ausgelöst. Eine Ausnahme ist ein Python-Objekt, das einen Fehler darstellt.
Wenn ein Python-Skript eine Ausnahme auslöst, muss es die Ausnahme entweder sofort behandeln, andernfalls wird es beendet und beendet.
Behandlung einer Ausnahme
Wenn Sie verdächtigen Code haben, der eine Ausnahme auslösen kann, können Sie Ihr Programm verteidigen, indem Sie den verdächtigen Code in a einfügentry:Block. Fügen Sie nach dem try: -Block einexcept: Anweisung, gefolgt von einem Codeblock, der das Problem so elegant wie möglich behandelt.
Syntax
Hier ist eine einfache Syntax von try .... außer ... else- Blöcken -
try:
You do your operations here;
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
Hier sind einige wichtige Punkte zur oben genannten Syntax:
Eine einzelne try-Anweisung kann mehrere Ausnahmen enthalten. Dies ist nützlich, wenn der try-Block Anweisungen enthält, die verschiedene Arten von Ausnahmen auslösen können.
Sie können auch eine generische Ausnahmeklausel angeben, die jede Ausnahme behandelt.
Nach den Ausnahmeklauseln können Sie eine else-Klausel einfügen. Der Code im else-Block wird ausgeführt, wenn der Code im try: -Block keine Ausnahme auslöst.
Der else-Block ist ein guter Ort für Code, der den Schutz von try: block nicht benötigt.
Beispiel
In diesem Beispiel wird eine Datei geöffnet, der Inhalt in die Datei, geschrieben und ordnungsgemäß ausgegeben, da überhaupt kein Problem vorliegt.
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
fh.close()
Dies ergibt das folgende Ergebnis:
Written content in the file successfully
Beispiel
In diesem Beispiel wird versucht, eine Datei zu öffnen, für die Sie keine Schreibberechtigung haben. Daher wird eine Ausnahme ausgelöst.
#!/usr/bin/python
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
Dies ergibt das folgende Ergebnis:
Error: can't find file or read data
Die Ausnahmeklausel ohne Ausnahmen
Sie können auch die Ausnahme-Anweisung ohne Ausnahmen verwenden, die wie folgt definiert sind:
try:
You do your operations here;
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
Diese Art von a try-exceptAnweisung fängt alle auftretenden Ausnahmen ab. Die Verwendung dieser Art von Try-Except-Anweisung wird jedoch nicht als gute Programmierpraxis angesehen, da sie alle Ausnahmen abfängt, den Programmierer jedoch nicht dazu veranlasst, die Hauptursache des möglicherweise auftretenden Problems zu identifizieren.
Die Ausnahmeklausel mit mehreren Ausnahmen
Sie können dieselbe Ausnahme- Anweisung auch verwenden, um mehrere Ausnahmen wie folgt zu behandeln:
try:
You do your operations here;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
Die Try-finally-Klausel
Sie können eine verwenden finally: Block zusammen mit einem try:Block. Der finally-Block ist ein Ort, an dem Code eingefügt werden kann, der ausgeführt werden muss, unabhängig davon, ob der try-Block eine Ausnahme ausgelöst hat oder nicht. Die Syntax der try-finally-Anweisung lautet:
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Sie können die else- Klausel nicht zusammen mit einer finally-Klausel verwenden.
Beispiel
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print "Error: can\'t find file or read data"
Wenn Sie nicht berechtigt sind, die Datei im Schreibmodus zu öffnen, führt dies zu folgendem Ergebnis:
Error: can't find file or read data
Das gleiche Beispiel kann wie folgt sauberer geschrieben werden:
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print "Going to close the file"
fh.close()
except IOError:
print "Error: can\'t find file or read data"
Wenn im try- Block eine Ausnahme ausgelöst wird , wird die Ausführung sofort an den finally- Block übergeben. Nachdem alle Anweisungen im finally- Block ausgeführt wurden, wird die Ausnahme erneut ausgelöst und in den Except- Anweisungen behandelt, sofern sie in der nächsthöheren Ebene der try-Except- Anweisung vorhanden sind.
Argument einer Ausnahme
Eine Ausnahme kann ein Argument haben , bei dem es sich um einen Wert handelt, der zusätzliche Informationen zum Problem enthält. Der Inhalt des Arguments variiert ausnahmsweise. Sie erfassen das Argument einer Ausnahme, indem Sie eine Variable in der Ausnahmeklausel wie folgt angeben:
try:
You do your operations here;
......................
except ExceptionType, Argument:
You can print value of Argument here...
Wenn Sie den Code schreiben, um eine einzelne Ausnahme zu behandeln, kann eine Variable dem Namen der Ausnahme in der Ausnahme-Anweisung folgen. Wenn Sie mehrere Ausnahmen abfangen, kann eine Variable dem Tupel der Ausnahme folgen.
Diese Variable erhält den Wert der Ausnahme, der hauptsächlich die Ursache der Ausnahme enthält. Die Variable kann einen einzelnen Wert oder mehrere Werte in Form eines Tupels erhalten. Dieses Tupel enthält normalerweise die Fehlerzeichenfolge, die Fehlernummer und eine Fehlerstelle.
Beispiel
Das Folgende ist ein Beispiel für eine einzelne Ausnahme -
#!/usr/bin/python
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "The argument does not contain numbers\n", Argument
# Call above function here.
temp_convert("xyz");
Dies ergibt das folgende Ergebnis:
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
Ausnahmen auslösen
Sie können Ausnahmen auf verschiedene Arten auslösen, indem Sie die Raise-Anweisung verwenden. Die allgemeine Syntax für dieraise Aussage ist wie folgt.
Syntax
raise [Exception [, args [, traceback]]]
Hier ist Exception der Ausnahmetyp (z. B. NameError) und argument ist ein Wert für das Exception-Argument. Das Argument ist optional. Wenn nicht angegeben, lautet das Ausnahmeargument None.
Das letzte Argument, Traceback, ist ebenfalls optional (und wird in der Praxis nur selten verwendet). Falls vorhanden, handelt es sich um das für die Ausnahme verwendete Traceback-Objekt.
Beispiel
Eine Ausnahme kann eine Zeichenfolge, eine Klasse oder ein Objekt sein. Die meisten Ausnahmen, die der Python-Kern auslöst, sind Klassen mit einem Argument, das eine Instanz der Klasse ist. Das Definieren neuer Ausnahmen ist recht einfach und kann wie folgt erfolgen:
def functionName( level ):
if level < 1:
raise "Invalid level!", level
# The code below to this would not be executed
# if we raise the exception
Note:Um eine Ausnahme abzufangen, muss sich eine "Ausnahme" -Klausel auf dieselbe Ausnahme beziehen, die entweder als Klassenobjekt oder als einfache Zeichenfolge ausgelöst wird. Um beispielsweise die obige Ausnahme zu erfassen, müssen wir die Ausnahmeklausel wie folgt schreiben:
try:
Business Logic here...
except "Invalid level!":
Exception handling here...
else:
Rest of the code here...
Benutzerdefinierte Ausnahmen
Mit Python können Sie auch eigene Ausnahmen erstellen, indem Sie Klassen aus den integrierten Standardausnahmen ableiten.
Hier ist ein Beispiel für RuntimeError . Hier wird eine Klasse erstellt, die von RuntimeError untergeordnet ist . Dies ist nützlich, wenn Sie spezifischere Informationen anzeigen müssen, wenn eine Ausnahme abgefangen wird.
Im try-Block wird die benutzerdefinierte Ausnahme ausgelöst und im Ausnahmeblock abgefangen. Mit der Variablen e wird eine Instanz der Klasse Networkerror erstellt .
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
Sobald Sie die obige Klasse definiert haben, können Sie die Ausnahme wie folgt auslösen:
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args