54 votes

python essayer:sauf:enfin

# Open new file to write
file = None
try:
    file = open(filePath, 'w')
except IOError:
    msg = ("Unable to create file on disk.")
    file.close()
    return
finally:
    file.write("Hello World!")
    file.close()

Le code ci-dessus est extrait d'une fonction. L'un des systèmes de l'utilisateur signale une erreur en ligne :

 file.write("Hello World!")

Erreur:

 AttributeError: 'NoneType' object has no attribute 'write'

La question est, si python ne parvient pas à ouvrir le fichier donné, le bloc 'except' s'exécute et il doit return, mais le contrôle est transféré à la ligne qui génère une erreur donnée. La valeur de la variable 'file' est 'Aucun'.

Des pointeurs?

7voto

Sreenath Nannat Points 1256

quelle est la logique d'inclure le

file.write("Hello World!")

à l'intérieur de la clause finally Je pense qu'il doit être mis dans la try elle-même.

 try:
        file = open(filePath, 'w')
        file.write("Hello World!")
except IOError:
        print("Unable to create file on disk.")
finally:
        file.close()

2voto

Voici la solution la plus directe à votre problème. J'utilise l'idiome de vérifier file_obj != None dans le bloc finally

Soit dit en passant, vous devez savoir que file est un nom de classe Python, vous devez donc choisir un nom de variable différent.

 file_obj = None
try:
    file_obj = open(filePath, 'w')
except IOError:
    msg = ("Unable to create file on disk.")
    file_obj.close()
    return
finally:
    if file_obj != None:
        file_obj.write("Hello World!")
        file_obj.close()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X