Laufzeitfehler in Python (Laufzeitfehler in Python), article, Seite 724104
https://www.purl.org/stefan_ram/pub/laufzeitfehler_python (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Python-Kurs

Laufzeitfehler in Python 

Fehlermeldungen vor Beginn der Ausführung

Blöcke

Unter einem Block  verstehen wir eine Zeile, die in die Konsole eingegeben wird, oder ein Skript.

Vor der Ausführung eines Blocks wird der Block von der Python -Interpretation überprüft. Falls der Block in korrekter Syntax geschrieben und korrekt eingerückt wurde, wird mit der Ausführung diese Blocks begonnen.

Syntaxfehler

Vor der Ausführung eines Blocks wird geprüft, ob dieser in der Syntax von Python  geschrieben ist. Falls nicht, so wird er nicht ausgeführt und eine Fehlermeldung ausgegeben. Solche Fehlermeldungen nennen wir einen Syntaxfehler .

Protokoll (gekürzt)
$
SyntaxError
Protokoll (gekürzt)
    print( "Kraftwagen" )
IndentationError

Einrückungsfehler

Vor der Ausführung eines Blocks wird geprüft, ob dieser korrekt eingerückt ist. Falls nicht, so wird er nicht ausgeführt und eine Fehlermeldung ausgegeben. Solche Fehlermeldungen nennen wir einen Einrückungsfehler.

Protokoll (gekürzt)
    print( "Kraftwagen" )
IndentationError

Abbruch der Ausführung

Falls bei der Prüfung eines Blocks vor der Ausführung eine Syntaxfehler, ein Einrückungsfehler oder ein ähnlicher Fehler gemeldet wird, dann wird die Ausführung des betreffenden Blocks nicht begonnen.

Laufzeitfehler

Fehler, die bei der Ausführung (Abarbeitung) eines Blockes gemeldet werden, nennen wir Laufzeitfehler.

Abbruch der Ausführung

Zunächst wird ein Block normal ausgeführt bis gegebenenfalls ein Laufzeitfehler auftritt wird. Sobald ein Laufzeitfehler auftritt wird die Abarbeitung des Blocks beendet  und eine Fehlermeldung ausgegeben.

Division durch 0

Ein Versuch der Division durch »0« führt zu einem Nulldivisionsfehler.

Protokoll (gekürzt)
print( 1/0 )
ZeroDivisionError

Weil die Abarbeitung des Blocks durch Laufzeitfehler abgebrochen wird, wird bei der Ausführung der folgenden Zeile nur »a«, nicht aber »b« ausgegeben.

Protokoll (gekürzt)
print( "a" ); print( 1/0 ); print( "b" )
a
ZeroDivisionError

Namensfehler

Ein Versuch der Auswertung eines nicht definierten Namens führt zu einem Namensfehler.

Protokoll (gekürzt)
x
NameError

Typfehler

Aufrufe einiger Funktionen mit unpassenden Argumentlisten führen zum Typfehlern.

Protokoll (gekürzt)
len( None )
TypeError

Dateiendfehler ⃗

Versuche, aus einer Datei zu lesen, die bereits vollständig gelesen wurde, führen zu Dateiendfehlern.

Protokoll (gekürzt)

loop( lambda:print( eval( input() )))

^Z

EOFError

Unter Windows  hat ^Z (Eingabe mit: Strg-Z) die Bedeutung „Ende der Datei“. Unter Linux  wäre dies ^D.

Wertfehler

Versuche, eine Zeichenfolge als Zahlenwert zu interpretieren, die kein geeignetes Numerale ist, führen zu einem Wertfehler.

Protokoll (gekürzt)
int( "a" )
ValueError

Weitere Arten von Fehlern

Es gibt noch weitere als die hier genannten Fehler. (Einige Typen von Fehlern, Warnung oder Benachrichtigungen sind: »IndentationError«, »SyntaxError«, »SyntaxWarning«, »TabError«, »ArithmeticError«, »AssertionError«, »AttributeError«, »BufferError«, »BytesWarning«, »DeprecationWarning«, »EnvironmentError«, »EOFError«, »Exception«, »FutureWarning«, »OSError«, »FloatingPointError«, »GeneratorExit«, »ImportError«, »ImportWarning«, »IndexError«, »IOError«, »KeyboardInterrupt«, »KeyError«, »LookupError«, »MemoryError«, »NameError«, »NotImplementedError«, »OverflowError«, »PendingDeprecationWarning«, »UnicodeDecodeError«, »ReferenceError«, »ResourceWarning«, »UnicodeError«, »RuntimeError«, »RuntimeWarning«, »StopIteration«, »SystemError«, »SystemExit«, »TypeError«, »UnboundLocalError«, »UnicodeEncodeError«, »UnicodeTranslateError«, »UnicodeWarning«, »UserWarning«, »ValueError«, »Warning«, »WindowsError« sowie »ZeroDivisionError«.)

Eine umfassendere Auflistung findet man im Kapitel “Built-in Exceptions ” der “The Python Library Reference, Release 3.7.0a1 ”.

Abfangen von Fehlermeldungen

Laufzeitfehler können mit »try« und »except« abgefangen werden.

Die Suite, welche einen Laufzeitfehler melden könnte muß dazu auf »try:« folgen. Wir nennen sie try-Suite.

Die Suite, welche beim Auftreten eines Laufzeitfehlers in der try-Suite ausgeführt werden soll, wird hinter »except:« geschrieben. Wir nennen sie except-Suite.

main.py

try:

print( 'try:' )

1/0

print( 'tried.' )

except:

print( 'except:' )

print( 'continuation' )

Protokoll
try:
except:
continuation

Abfangen spezieller Fehlermeldungen

Es ist besser, nur genau die spezielle Fehlermeldung abzufangen, die man erwartet, da sonst andere Fehler fälschlicherweise abgefangen und falsch interpretiert oder „versteckt“ werden.

Hinter »except« kann eine Typ einer Laufzeitfehlermeldung geschrieben werden. Dann wird die Fehlermeldung nur abgefangen, wenn sie diesen Typ hat. Wir benennen die except-Suite dann auch nach jenem Typ, also beispielsweise ZeroDivisionError-Suite.

main.py

try:

print( 'try:' )

1/0

print( 'tried.' )

except ZeroDivisionError:

print( 'except ZeroDivisionError:' )

print( 'continuation' )

Protokoll
try:
except ZeroDivisionError:
continuation

ℛ Stilregel Es gilt im allgemeinen als besserer Stil, nur genau die Fehlermeldungen abzufangen, die man auch erwartet.

Abfangen mehrerer Fehlertypen

Hierzu können die Typen aufgelistet werden, aber die Liste muß dann in runden Klammern stehen.

Quelltext
except( RecursionError, MemoryError, ZeroDivisionError, OverflowError ):

»else«

Eine optionale else-Klausel, welche sich hinter allen except-Klauseln befinden muß, wird genau dann ausgeführt, wenn die try-Klausel vollständig ausgeführt wurde.

main.py

try:

print( 'try:' )

print( 'tried.' )

except ZeroDivisionError:

print( 'except NameError:' )

else:

print( 'else' )

print( 'continuation' )

Protokoll
try:
tried.
else
continuation
main.py

try:

print( 'try:' )

1/0

print( 'tried.' )

except ZeroDivisionError:

print( 'except ZeroDivisionError:' )

else:

print( 'else' )

print( 'continuation' )

Protokoll
try:
except ZeroDivisionError:
continuation

Fehlermeldungen in einer else-Klausel werden nicht durch die voranstehenden except-Klauseln abgefangen.

»finally«

Ein optionale finally-Klausel muß die letzte Klause einer try-Anweisung sein. Sie wird garantiert immer ausgeführt.

main.py

try:

print( 'try:' )

1/0

print( 'tried.' )

except ZeroDivisionError:

print( 'except ZeroDivisionError:' )

finally:

print( 'finally' )

print( 'continuation' )

Protokoll
try:
except ZeroDivisionError:
finally
continuation
main.py

try:

print( 'try:' )

1/2

print( 'tried.' )

except ZeroDivisionError:

print( 'except ZeroDivisionError:' )

finally:

print( 'finally' )

print( 'continuation' )

Protokoll
try:
finally
continuation

Normalerweise muß eine try-Anweisung eine except-Klausel enthalten; eine try-Anweisung mit einer finally-Klausel darf aber auch ohne except-Klausel geschrieben werden.

Verstecken von Ausnahmen

»exception Exception« fängt alle  Ausnahmen, da »Exception« ein Obertyp aller Ausnahmen ist und eine Fangklausel alle Ausnahmen eines Untertyps des angegebenen Typs fängt.

Ausnahmen, die mit »except Exception« gefangen werden, müssen unbedingt angezeigt werden, da sonst auch schwere Programmfehler nicht angezeigt werden.

main.py

try:

print( alpha )

except Exception:

pass

Protokoll
(keine Ausgabe)
main.py

try:

print( alpha )

except Exception as inst:

print( type( inst ))

print( inst )

Protokoll
<class 'NameError'>
name 'alpha' is not defined

Oben haben wir die as-Form von »except« verwendet, die es erlaubt, der gefangenen Ausnahme einen Namen zu geben.

 

Übungsfragen

?   Übungsfrage

Welche Ausgabe erzeugt das folgende Programm?

main.py

try:
print( "alpha" )
1/1
print( "gamma" )

except ZeroDivisionError:
print( "delta" )

print( "epsilon" )

?   Übungsfrage

Welche Ausgabe erzeugt das folgende Programm?

main.py

try:
print( "alpha" )
1/0
print( "gamma" )

except ZeroDivisionError:
print( "delta" )

print( "epsilon" )

?   Übungsfrage

Welche Ausgabe erzeugt das folgende Programm?

main.py

try:
while True:
print( "alpha" )
1/0
print( "gamma" )
print( "delta" )

except ZeroDivisionError:
print( "epsilon" )

print( "zeta" )

?   Übungsfrage

Welche Ausgabe erzeugt das folgende Programm?

main.py

def f():
print( "alpha" )
1/0
print( "gamma" )

def g():
print( "delta" )
f()
print( "epsilon" )

try:
print( "zeta" )
g()
print( "eta" )

except ZeroDivisionError:
print( "theta" )

print( "iota" )

Übungsaufgaben

/   Übungsaufgabe

Schreiben Sie eine Funktion zum Einlesen einer ganzen Zahl, die einen Wert vom Typ »int« zurückgibt.

Wenn kein ganzzahliges Numerale eingegeben wurde, das auf die in Python  übliche Weise in einen Wert vom Typ »int« gewandelt werden kann, soll die Funktion den Benutzer erneut nach einer Zahl fragen, bis ein umwandelbares ganzzahliges Numerale eingelesen werden konnte.

Beispieldialog (Die Abfragetexte müssen nicht wörtlich übernommen werden)

Zahl? Zehn

?Bitte erneut versuchen

Zahl?

?Bitte erneut versuchen

Zahl? 10

/   Übungsaufgabe

Schreiben Sie eine Funktion zum Einlesen einer Zahl, die einen Wert vom Typ »float« zurückgibt.

Wenn kein Numerale eingegeben wurde, das auf die in Python  übliche Weise in einen Wert vom Typ »float« gewandelt werden kann, soll die Funktion den Benutzer erneut nach einer Zahl fragen, bis ein umwandelbares Numerale eingelesen werden konnte.

/   Übungsaufgabe

Schreiben Sie eine Funktion zum Einlesen einer Zahl, die einen Wert vom Typ »int« oder »float« zurückgibt.

Wenn kein Numerale eingegeben wurde, das auf die in Python  übliche Weise in einen Wert vom Typ »int« oder »float« gewandelt werden kann, soll die Funktion den Benutzer erneut nach einer Zahl fragen, bis ein umwandelbares Numerale eingelesen werden konnte.

Falls ein Numerale eingegeben wurde, das auf die in Python  übliche Weise in einen Wert vom Typ »int« oder »float« gewandelt werden kann, soll die Funktion den Wert als int-Wert zurückgeben, falls er auf die in Python  übliche Weise in einen Wert vom Typ »int« gewandelt werden kann, andernfalls soll die Funktion einen float-Wert zurückgeben.

Zitate

code block

The Python Language Reference, Release 3.7.0a1; 4.1
A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter [ɪnˈtɚprəđɚ] or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter [ɪnˈtɚprəđɚ] command line with the ‘-c’ option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block.

EAFP

The Python Language Reference
EAFP
Easier to ask for forgiveness than permission
This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style common to many other languages such as C.
LBYL
Look before you leap.
This coding style explicitly tests for pre-conditions before making calls or lookups. This style contrasts with the EAFP approach and is characterized by the presence of many if statements.
In a multi-threaded environment, the LBYL approach can risk introducing a race condition between “the looking” and “the leaping”. For example, the code, if key in mapping: return mapping[key] can fail if another thread removes key from mapping after the test, but before the lookup. This issue can be solved with locks or by using the EAFP approach.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724104 stefan_ram:724104 Laufzeitfehler in Python Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724104, slrprddef724104, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/laufzeitfehler_python