web-dev-qa-db-fra.com

Comment puis-je déclencher une FileNotFoundError correctement?

J'utilise une bibliothèque tierce qui convient, mais ne gère pas les fichiers inexistants comme je le souhaiterais. Lorsque vous lui donnez un fichier inexistant, au lieu de relever le bon vieux

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

cela soulève un message obscur:

OSError: Syntax error in file None (line 1)

Je ne veux pas gérer le fichier manquant, je ne veux pas capturer ni gérer l'exception, je ne veux pas déclencher une exception personnalisée, je ne veux pas non plus que je open le fichier, ni le créer si ça n'existe pas.

Je veux seulement vérifier qu'il existe (os.path.isfile(filename) fera l'affaire) et si ce n'est pas le cas, déclenchez simplement un FileNotFoundError approprié.

J'ai essayé ceci:

#!/usr/bin/env python3

import os

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

ce qui ne produit que:

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

C'est mieux qu'une "erreur de syntaxe dans le fichier aucun", mais comment est-il possible de déclencher la "vraie" exception python avec le message approprié, sans avoir à la réimplémenter?)

36
zezollo

Passer les arguments:

import errno
import os

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

FileNotFoundError est une sous-classe de OSError , qui prend plusieurs arguments. Le premier est un code d'erreur du module errno (le fichier non trouvé est toujours errno.ENOENT), Le second le message d'erreur (utilisez os.strerror() pour l'obtenir), et transmettez le nom du fichier en tant que 3ème.

La dernière représentation sous forme de chaîne utilisée dans une trace est construite à partir de ces arguments:

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