Was ist, wenn die Datei nicht existiert?
>>> f = open("junk") Traceback (most recent call last): File "<stdin>", line 1, in ? IOError: [Errno 2] No such file or directory: 'junk'
Sowas heißt Exception und ist ein allgemeiner Mechanismus zur Fehlerbehandlung. Es gibt verschiedene Sorten von Exceptions:
(und viele mehr).
Exceptions kann man behandeln:
>>> import sys >>> try: ... f = open("junk") ... except IOError: ... sys.stderr.write("Hilfe...\n") ... Hilfe...
Anmerkungen:
Hinter einem try: können mehrere except-statements für verschiedene Typen von Exceptions kommen, und schließlich noch ein else-statement, der ausgeführt wird, wenn keine Exception ausgelöst wurde.
Exceptions kann man auch selbst auslösen:
>>> raise IOError("Brainless User") Traceback (most recent call last): File "<stdin>", line 1, in ? IOError: Brainless User
Hinter raise steht also ein (normalerweise) mit einem String instanziertes Exception-Objekt.
Eine gewisse Sonderrolle hat die Exception KeyboardInterrupt. Sie wird ausgelöst, wenn die Benutzerin Control-C drückt (allgemeiner die Interrupt-Taste, noch allgemeiner, wenn das Programm das INT-Signal (vgl. man signal) geschickt bekommt). Auch diese Exception kann man fangen.
Schließlich gibt es noch das nicht wirklich mit Exceptions zusammenhängende try...finally-Konstrukt, bei dem, ganz egal, was im try:-statement passiert, der Code hinter finally: auf jeden Fall ausgeführt wird. So etwas ist praktisch, um in kritischen Codepassagen am Ende wieder einen definierten Zustand herzustellen. Wir werden später Beispiele dafür sehen.
Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen
(1)
Probiert, Exeptions der erwähnten Arten auszulösen und zu fangen.
(2)
Wie kann man ein Programm schreiben, dass noch schnell “Röchel” sagt, wenn es durch ein Control-C abgebrochen wird? Kann man auf diese Weise Control-Cs ganz ignorieren?
(3)
Um zu verstehen, was das mit stderr und stdout soll, schreibt euch ein Programm, das nach einer Weile eine Fehlermeldung ausgibt, einmal auf stderr, einmal auf stdout, also etwa so:
import time, sys time.sleep(3) sys.stderr.write("Fehler!!!\n")
Ruft dieses Programm von der Kommandozeile aus auf und leitet die Ausgabe in eine Datei um (das geht auch unter DOS/Windows):
examples> python prog.py > junk
Was beobachtet ihr?