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 arraché d'une fonction. L'un des systèmes de l'utilisateur signale une erreur dans la ligne:

file.write("Hello World!")

erreur:

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

la Question Est, si python ne parvient pas à ouvrir un fichier donné, 'sauf' le bloc exécute et il doit le retour, mais le contrôle est transféré à la ligne qui lance l'erreur donnée. La valeur de la variable' file ' est 'None'.

les pointeurs?

34
demandé sur Sreenath Nannat 2011-10-15 15:12:24

8 réponses

vous ne devriez pas écrire dans le fichier finally bloquez comme toutes les exceptions soulevées là ne seront pas attrapées par le except bloc.

except Bock s'exécute s'il y a une exception soulevée par le bloc d'essai. finally bloc toujours exécute tout ce qui se passe.

en outre, il ne devrait pas être nécessaire d'initialiser le file variable à none.

return dans le except block ne sautera pas finally bloc. Par sa nature même, il ne peut pas être sauté, c'est pourquoi vous voulez y mettre votre code de "nettoyage" (c'est-à-dire fermeture de fichiers).

Donc, si vous voulez utiliser l'essayer:hormis:enfin, vous devriez faire quelque chose comme ceci:

try:
    f = open("file", "w")
    try:
        f.write('Hello World!')
    finally:
        f.close()
except IOError:
    print 'oops!'

une façon beaucoup plus propre de faire ceci est d'utiliser le with déclaration:

try:
    with open("output", "w") as outfile:
        outfile.write('Hello World')
except IOError:
    print 'oops!'
78
répondu Acorn 2011-10-15 12:14:32

Si le fichier n'est pas ouvert, la ligne file = open(filePath, 'w') échoue, donc rien n'est assigné à file.

except la clause s'exécute, mais rien n'est dans le fichier, donc file.close() échoue.

finally la clause fonctionne toujours, même s'il y a une exception. Et depuis file est toujours aucun Vous obtenez une autre exception.

else l'article au lieu de finally pour les choses qui ne se produisent que s'il n'y avait pas exception.

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

Pourquoi