2016-03-18 18 views
19

Ich verwende eine Drittanbieter-Bibliothek, die in Ordnung ist, aber nicht mit nicht vorhandenen Dateien so umgehen kann, wie ich es möchte. Wenn es eine nicht-existente Datei geben, statt der guten altenWie hebe ich einen FileNotFoundError richtig an?

FileNotFoundError: [Errno 2] No such file or directory: 'nothing.txt' 

Anheben es einige obskure Nachricht aufwirft:

OSError: Syntax error in file None (line 1) 

Ich will nicht die fehlende Datei behandeln, wollen nicht Um die Ausnahme nicht zu fangen oder zu behandeln, möchte ich keine benutzerdefinierte Ausnahme auslösen, ich möchte weder die Datei open noch die Datei erstellen, wenn sie nicht existiert.

Ich möchte nur überprüfen, ob es existiert (os.path.isfile(filename) wird den Trick tun) und wenn nicht, dann nur eine richtige FileNotFoundError auslösen.

Ich versuchte dies:

#!/usr/bin/env python3 

import os 

if not os.path.isfile("nothing.txt"): 
    raise FileNotFoundError 

was nur Ausgänge:

Traceback (most recent call last): 
    File "./test_script.py", line 6, in <module> 
    raise FileNotFoundError 
FileNotFoundError 

Das ist besser als ein „Syntaxfehler in der Datei None“, aber wie ist es möglich, die „echte“ zu erhöhen Python-Ausnahme mit der richtigen Nachricht, ohne es neu zu implementieren?

Antwort

33

Pass in Argumente:

import errno 
import os 

raise FileNotFoundError(
    errno.ENOENT, os.strerror(errno.ENOENT), filename) 

FileNotFoundError ist eine Unterklasse von OSError, die mehrere Argumente übernimmt. Der erste ist ein Fehlercode von der errno module (Datei nicht gefunden ist immer errno.ENOENT), die zweite die Fehlermeldung (verwenden Sie os.strerror(), um dies zu erhalten), und übergeben Sie den Dateinamen als 3..

Die endgültige String-Darstellung in einer Traceback verwendet wird, aus diesen Argumenten gebaut:

>>> print(FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), 'foobar')) 
[Errno 2] No such file or directory: 'foobar' 
+0

Perfect! Ich habe mich so angestrengt, den richtigen Weg zu finden, dies zu schreiben. – zezollo

+0

@zezollo: Ich habe die Antwort aktualisiert; Ich habe 'os.strerror()' jetzt gefunden (ich wusste * es gab irgendwo eine Zuordnung von Fehlernummer zu String-Nachricht). –

Verwandte Themen