Seite 1 von 1

Welche Art von Exception abfangen bei os.makedirs

Verfasst: Montag 12. November 2012, 12:22
von /me
In einem Modul schreibe ich eine Datei in ein Verzeichnis, das möglicherweise noch nicht existiert. Mit os.makedirs stelle ich die Existenz des Verzeichnisses (einigermaßen) sicher. Falls das Verzeichnis bereits existiert erhalte ich eine Exception die ich ignoriere.

Code: Alles auswählen

def _create_path(foldername):
    try:
        os.makedirs(foldername)
    except Exception:
        pass
Das Abfangen der generischen Exception ist jetzt natürlich sehr breit angelegt. Das Problem beim Abfangen einer spezialisierteren Ausnahme ist allerdings, dass unterschiedliche Betriebssysteme bei dieser Funktion unterschiedliche konkrete Ausprägungen von Exceptions werfen. Natürlich kann ich mehrere unterschiedliche Exceptions einfangen, aber die müsste ich erst einmal alle finden und dann auch noch davon ausgehen, dass in den nächsten Jahren nicht noch mehr hinzukommen.

Daraus ergeben sich folgende kurze Fragen: Lasse ich es einfach so? Gibt es Alternativvorschläge?

Re: Welche Art von Exception abfangen bei os.makedirs

Verfasst: Montag 12. November 2012, 12:32
von sparrow
Hm, es könnte ja auch ein Rechteproblem vorliegen, dass dir also gar nicht erlaubt ist das Verzeichnis zu erstellen. Außerdem könnten Inodes oder Plattenspeicher ausgehen.

Ich würde das also nicht so lassen, denn bisher gehst du davon aus, dass das Verzeichnis da ist wenn es einen Fehler gibt, falls ich dich richtig verstehe.

Eine Alternative wäre zu prüfen ob das Verzeichnis schon da ist (os.path.exists), und makedirs nur auszuführen, wenn es eben noch nicht da ist. Wenn es dann zu einem Fehler kommt kannst du zumindest sicher sein, dass das Erstellen nicht erfolgreich war, und der Grund dafür nicht die vorhergehende Existenz ist.

Code: Alles auswählen

def _create_path(foldername):
    if not os.path.exists(foldername):
        try:
            os.makedirs(foldername)
        except Exception:
            print "Fehler beim Anlegen des Verzeichnisses!"

Re: Welche Art von Exception abfangen bei os.makedirs

Verfasst: Montag 12. November 2012, 12:37
von /me
sparrow hat geschrieben:Hm, es könnte ja auch ein Rechteproblem vorliegen, dass dir also gar nicht erlaubt ist das Verzeichnis zu erstellen. Außerdem könnten Inodes oder Plattenspeicher ausgehen.
Das Problem ist mir bewusst (deshalb schrieb ich: "einigermaßen") und ich gehe es auf übergeordneter Ebene an, da in dem Fall das Programm kontrolliert abbrechen soll.
sparrow hat geschrieben:Eine Alternative wäre zu prüfen ob das Verzeichnis schon da ist (os.path.exists), und makedirs nur auszuführen, wenn es eben noch nicht da ist.
Ich möchte hier auch das EAFP-Prinzip anwenden. Bei der von dir beschriebenen Vorgehensweise könnte ich zudem immer noch auf eine Race Condition stoßen.

Re: Welche Art von Exception abfangen bei os.makedirs

Verfasst: Montag 12. November 2012, 12:41
von sparrow
Mir wäre es zu unsicher das Programm in dieser "Unsicherheit" zu lassen, egal was das Mantra vorgibt.
Wenn du Angst vor einer RaceCondition hast, könntest du in der Behandlung der Exception einmal nachschauen ob das Anlegen des Verzeichnisses erfolgreich war.

Code: Alles auswählen

def _create_path(foldername):
    try:
        os.makedirs(foldername)
    except Exception:
        if not os.path.exists(foldername):
            raise

Re: Welche Art von Exception abfangen bei os.makedirs

Verfasst: Montag 12. November 2012, 13:03
von lunar
@/me Nutze entweder Python 3.3 und fange "FileExistsError" ab, oder fange "EnvironmentError" ab und vergleiche das "errno" Attribut des Ausnahmeobjekts mit "errno.EEXIST". In diesem Fall - und nur in diesem Fall - ist das Anlegen gescheitert, weil das Zielverzeichnis bereits existiert.