J'utilise actuellement Python 2 sur un projet qui nécessite une exception intégrée Python 3: FileNotFoundError
. Comment dois-je procéder?
Vous pouvez bien sûr définir toutes les exceptions que vous souhaitez.
Mais ils ne vous feront aucun bien. L'intérêt de FileNotFoundError
est que toute opération Python qui se heurte à une erreur de fichier introuvable lèvera cette exception. La simple définition de votre propre exception ne rendra pas cela vrai) . Tout ce que vous allez obtenir est un OSError
(ou IOError
, selon la version 2.x) avec une valeur errno
appropriée. Si vous essayez de gérer un FileNotFoundError
, votre gestionnaire ne sera jamais appelé.
Donc, ce que vous voulez vraiment (par exemple):
try:
f = open(path)
except OSError as e:
if e.errno == errno.ENOENT:
# do your FileNotFoundError code here
else:
raise
Vous pouvez utiliser IOError
à la place:
Déclenché lorsqu'une opération d'E/S (telle qu'une instruction d'impression, la fonction open () intégrée ou une méthode d'un objet fichier) échoue pour une raison liée aux E/S, par exemple , "Fichier introuvable" ou "disque plein".
Cette classe est dérivée de EnvironmentError. Voir la discussion ci-dessus pour plus d'informations sur les attributs d'instance d'exception.
Modifié dans la version 2.6: socket.error modifié pour l'utiliser comme classe de base.
Vous pouvez simplement créer vous-même l'exception FileNotFoundError
:
class FileNotFoundError(OSError):
pass
Cette nouvelle classe d'exception hérite de OSError
tout comme celle de Python 3.x.
Voici une référence sur Exceptions définies par l'utilisateur en Python.
Réponse courte: tilisez simplement EnvironmentError
et cochez err.errno == errno.ENOENT
pour Python 2 ou Python 3.
Longue réponse:
Comme d'autres réponses l'ont mentionné, FileNotFoundError
est nouveau pour Python 3.
Python 2 utilisait OSError
(ou IOError
, selon la version 2.x). OSError
et IOError
héritent tous les deux de EnvironmentError
.
Dans Python 3, EnvironmentError
est aliasé à OSError
. FileNotFoundError
hérite de OSError
, ce qui signifie que FileNotFoundError
peut être intercepté avec EnvironmentError
, et il partage la même interface que OSError
et IOError
.
Alors bonne nouvelle! Cela signifie qu'il existe un moyen relativement simple de rendre votre projet compatible avec les deux Python 2 et Python 3 en même temps: laissez FileNotFoundError
hors de lui, et attrapez juste EnvironmentError
.
# Works for Python 2. Also works for Python 3.
import errno
try:
open("fake.file", 'r')
except EnvironmentError as err:
if err.errno == errno.ENOENT: # ENOENT -> "no entity" -> "file not found"
print("Caught 'file not found' exception")
else:
raise