web-dev-qa-db-fra.com

Comment importer FileNotFoundError depuis Python 3?

J'utilise actuellement Python 2 sur un projet qui nécessite une exception intégrée Python 3: FileNotFoundError. Comment dois-je procéder?

18
PSNR

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
29
abarnert

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.

5
Martin Thoma

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.

2
user2555451

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
0
cowlinator