Seite 1 von 1

Exceptions ignorieren und Funktion weiter ausführen?

Verfasst: Montag 2. November 2009, 02:42
von goldenapple
Hallo zusammen,

bin seit gestern dabei mich mit Python zu beschäftigen und komm bei einer kleinen Funktion die ich mir gerade zusammenbastele nicht weiter. Hoffe mir kann jemand helfen.

ALSO... ich möchte Dateien (jede Datei liegt einzeln in einem Ordner) in das übergeordnete Verzeichnis verschieben. Das klappt im großen und ganzen eigentlich auch, nur ist in jedem Ordner eine "Thumbs.db", was Python zum mekern veranlasst und den Vorgang abbrechen lässt. Meine Frage jetzt an euch, kann man diese Exception irgendwie ignorieren, damit die Funktion weiter und bis zum Ende ausgeführt wird oder, kann man eine Datei beim ausführen von shutil.move überschreiben?

hier mein Anfänger-Code:

Code: Alles auswählen


import os
import shutil
import sys

def movef(src):
    try:
        ordnerliste = os.listdir(src)
        for d in ordnerliste:
            pfad = src + d
            if os.path.isdir(pfad):
                files = os.listdir(pfad)
                for f in files:
                    pfad2 = pfad + "\\" + f
                    print("Verschieben: " + pfad2 + "   -------->   " + src)
                    shutil.move(pfad2, src)
    except:
        print("\n-------------------------------------------------\n")
        print("Unbekannter Fehler: ", sys.exc_info())



Fehlermeldung:

Code: Alles auswählen

Unbekannter Fehler:  (<class 'shutil.Error'>, Error("Destination path '#######\\Thumbs.db' already exists",), <traceback object at 0x02D78378>)
Vielen Dank schon mal!

goldenapple

Verfasst: Montag 2. November 2009, 05:37
von snafu
Man sollte nach Möglichkeit nur auf bestimmte Ausnahmen reagieren. Hier wäre es also:

Code: Alles auswählen

[...]
except shutil.Error:
    pass

Verfasst: Montag 2. November 2009, 07:19
von Pekh
Und um deine Frage gänzlich zu beantworten:

Packe den 'Try ... except shutil.Error' - Block direkt um 'shutil.move', also in die Schleife. Dann werden auftretende Fehler während des Verschiebens ignoriert und der Prozeß trotzdem fortgesetzt. Ob es wirklich wünschenswert ist, Fehler (auch wenn sie auf shutil.Error begrenzt sind) einfach zu ignorieren, sei mal dahingestellt.

Generell gilt: Try ... Except immer so kleinteilig und spezifisch wie möglich gestalten. Sonst läuft man Gefahr, Fehler, die man gar nicht abfangen wollte, zu verschleiern und wundert sich dann über das seltsame Verhalten des Programms ...