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